0

S#arp アーキテクチャ 1.0RC を使用して...

プロパティの 1 つを更新しないように見えるコントローラーがあります。

私のクラスは Manager プロパティを持つ User 抽象クラスです。Manager は、Employee と同様に User のサブクラスです。

Manager のプロパティ セッターを protected として宣言し、AddManager にメソッドを提供しました。そうすれば、マネージャーがそのエンティティのコレクションから持っているユーザーを制御することもできます。

私の問題は、ModelBinder がポストバックで更新されたアイテムの Manager プロパティを見つけられないことです。保護を削除すると、正常に動作します。保護されたバックを追加します。私にはスープはありません。

セッターを保護したまま、ポストバック時にコントローラーで値を取得できるのは、次のどの部分ですか?

ありがとう...

必須のマッピングは次のとおりです(特定のもの以外を一部編集しています)。

<hibernate-mapping xmlns="urn:nhibernate-mapping-2.2" default-access="">
  <class name="Core.User, Core, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null" table="Users" xmlns="urn:nhibernate-mapping-2.2">
    <id name="Id" type="Int32" unsaved-value="0" column="UserId">
        <generator class="identity" />
    </id>
 <le snip..>
<many-to-one access="field.camelcase-underscore" cascade="save-update" name="Manager" column="ManagerId" />
<joined-subclass name="Core.Employee, Core, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null">
  <key column="EmployeeId" />
</joined-subclass>
<joined-subclass name="Core.Approver, Core, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null">
  <key column="ManagerId" />
  <bag name="Users" lazy="true" cascade="save-update" inverse="true">
    <key column="ManagerId" />
    <one-to-many class="Core.User, Core, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null" />
  </bag>
</joined-subclass>

私のポリモーフィッククラスは

public abstract class User : Entity
{
    public virtual string Name { get; set; }
    private Manager _manager;
    public virtual Manager Manager
    {
        get { return _manager; }
        protected set { _manager = value; }
    }

    public virtual void SetManager(Manager manager)
    {
        if (_manager != null)
        {
            _manager.RemoveUser(this);
        }
        _manager = manager;
    }

}


public class Manager : User
{
    public Manager()
    {
        _users = new List<User>();
    }

    private IList<User> _users;
    public virtual IList<User> Users
    {
        get { return _users; }
        protected set { _users = value; }
    }

    public virtual void AddUser(User user)
    {
        if (_users.Contains(user)) return;
        Users.Add(user);
        user.SetManager(this);
    }

    public virtual void RemoveUser(User user)
    {
        if (!_users.Contains(user)) return;
        Users.Remove(user);
        user.SetManager(null);
    }
}
4

1 に答える 1

3

ドメイン エンティティをビューに渡す代わりに、ビューモデル クラスの使用を検討することをお勧めします。ドメイン クエリからビュー モデル クラスを設定し、それをビューに渡し、それが戻ってきたら、コントローラーでドメイン エンティティに再マップして続行することができます。これを行うのに役立つ優れたツールは、AutoMapper と呼ばれます。これは、今後の他の問題にも役立つ可能性があります。

CodePlex の AutoMapper

于 2009-09-02T22:44:10.060 に答える