0

使用 S#arp 架构 1.0RC...

我有一个控制器,它似乎永远不会更新我的一个属性。

我的类是具有 Manager 属性的 User 抽象类。Manager 是 User 的子类,Employee 也是。

我将 Manager 的属性设置器声明为受保护,并为 AddManager 提供了一个方法。这样,我还可以控制经理从该实体的集合中拥有的用户。

我的问题是 ModelBinder 没有在回发中找到更新项目的 Manager 属性。如果我删除受保护的,它工作正常。添加受保护的背部:我没有汤。

以下哪一部分允许我保护我的 setter 并在回发时仍然获得控制器中的值?

谢谢...

这是强制性的映射(一些非细节的编辑):

<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 回答