C# 如何从fluent nhibernate访问asp.net-mvc控制器中具有受保护setter的属性?

C# 如何从fluent nhibernate访问asp.net-mvc控制器中具有受保护setter的属性?,c#,asp.net-mvc,fluent-nhibernate,setter,s#arp-architecture,C#,Asp.net Mvc,Fluent Nhibernate,Setter,S#arp Architecture,使用S#arp架构1.0RC 我有一个控制器,似乎从来没有更新我的属性之一 My类是一个具有Manager属性的用户抽象类。经理是用户的子类,雇员也是 我将Manager的属性设置程序声明为受保护,并为AddManager提供了一个方法。这样,我还可以控制经理从该实体的集合中拥有的用户 我的问题是ModelBinder在回发中找不到更新项目的Manager属性。如果我删除受保护的,它可以正常工作。加上保护背:我没有汤 以下哪一部分允许我保护我的setter,并且仍然可以在回发的控制器中获取值?

使用S#arp架构1.0RC

我有一个控制器,似乎从来没有更新我的属性之一

My类是一个具有Manager属性的用户抽象类。经理是用户的子类,雇员也是

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

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

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

谢谢

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


我的多态类是

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);
    }
}
公共抽象类用户:实体
{
公共虚拟字符串名称{get;set;}
私人经理(u经理),;
公共虚拟管理器
{
获取{return\u manager;}
受保护集{u manager=value;}
}
公共虚拟空集合管理器(管理器)
{
如果(_manager!=null)
{
_manager.RemoveUser(此);
}
_经理=经理;
}
}
公共类管理器:用户
{
公共经理()
{
_用户=新列表();
}
私人IList_用户;
公共虚拟IList用户
{
获取{return\u users;}
受保护集{u users=value;}
}
公共虚拟void AddUser(用户用户)
{
如果(_users.Contains(user))返回;
用户。添加(用户);
user.SetManager(this);
}
公共虚拟void RemoveUser(用户用户)
{
如果(!\u users.Contains(user))返回;
用户。删除(用户);
user.SetManager(null);
}
}

> p>您可能需要考虑使用视图模型类,而不是将域实体传递给视图。您可以从域查询中填充视图模型类,将其传递给视图,当视图返回时,在控制器中将其重新映射到域实体并继续。一个伟大的工具,以帮助你做这件事是所谓的AutoMapper。这也可能有助于解决今后的其他问题


您可能想考虑使用视图模型类,而不是将域实体传递给视图。您可以从域查询中填充视图模型类,将其传递给视图,当视图返回时,在控制器中将其重新映射到域实体并继续。一个伟大的工具,以帮助你做这件事是所谓的AutoMapper。这也可能有助于解决今后的其他问题


谢谢你,瑞安。我现在会给AutoMapper看一看,并报告它是如何工作的。。。谢谢!这是我的答案。我已经看到了AutoMapper对我的好处。注意:我应该澄清一下,我在控制器中使用了ViewModel类并将其传递到我的页面——这是我知道的发送实体之外的SelectList项的最佳方式。谢谢,Ryan。我现在会给AutoMapper看一看,并报告它是如何工作的。。。谢谢!这是我的答案。我已经看到了AutoMapper对我的好处。注意:我应该澄清一下,我在控制器中使用了ViewModel类并将其传递到我的页面——这是我知道的发送实体之外的SelectList项的最佳方式。
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);
    }
}