如何从 Fluent-nhibernate 访问我的 asp.net-mvc 控制器中带有受保护设置器的属性?

发布于 2024-08-03 11:54:38 字数 2555 浏览 4 评论 0原文

使用 S#arp Architecture 1.0RC...

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

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

我将 Manager 的属性设置器声明为受保护的,并为 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);
    }
}

Using S#arp Architecture 1.0RC...

I have a controller that never seems to update one of my properties.

My class is a User abstract class with a Manager property. Manager is subclasses from User, as is Employee.

I declared the property setter for Manager as protected and provided a method to AddManager. That way, I could also control the Users that a Manager has from the collection in that entity.

My problem is that the ModelBinder doesn't locate the Manager property of the updated item on the postback. If I remove protected, it works fine. Add protected back: no soup for me.

What portion of the following allows me to keep my setter protected and still get the value in the controller on the postback?

Thanks...

Here's the obligatory mapping (some editing out of non-particulars):

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

My polymorphic class is

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);
    }
}

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

最丧也最甜 2024-08-10 11:54:38

您可能需要考虑使用视图模型类,而不是将域实体传递给视图。您可以从域查询中填充视图模型类,将其传递到您的视图,当它返回时,在控制器中将其重新映射到您的域实体并继续。 AutoMapper 是一个可以帮助您完成此任务的出色工具。这也可能有助于解决未来的其他问题。

CodePlex 上的 AutoMapper

You might want to consider use a view-model class instead of passing your domain entities to your views. You could populate your view-model class from your domain query, pass that to your view and when it comes back, in your controller re map it to your domain entity and carry on. A great tool to help you do this very thing is called AutoMapper. This may also help with other issues down the road.

AutoMapper on CodePlex

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文