2009-09-02 58 views
0

使用S#arp架构1.0RC ...如何从fluent-nhibernate在我的asp.net-mvc控制器中访问受保护的setter属性?

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

我的课是具有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); 
    } 
} 

回答

3

您可能要考虑在中使用视图模型类而不是将您的域名实体传递给您的观点。您可以从您的域查询中填充您的视图模型类,将其传递给您的视图,当它返回时,在您的控制器中将其映射到您的域实体并继续。帮助你做这件事的一个很好的工具叫做AutoMapper。这也可能有助于解决其他问题。

AutoMapper on CodePlex

+0

谢谢,瑞安。我现在将给AutoMapper一个看看,并报告它是如何工作的...赞赏! – 2009-09-02 23:10:00

+1

+1:始终使用视图模型。 – 2009-09-03 13:11:00

+0

这是我的答案。我已经看到AutoMapper会让我受益。 一个注意:我应该澄清,我*是*在我的控制器中使用ViewModel类并传递给我的页面 - 这是我知道发送SelectList项目存在于我的实体之外的最佳方式。 – 2009-09-09 13:29:43