【问题标题】:Nhibernate mapping / design issueNhibernate映射/设计问题
【发布时间】:2012-03-13 13:56:28
【问题描述】:

这个问题要么是由于我糟糕的项目设计,要么是我对如何使用 nhibernate 缺乏了解,或者两者兼而有之(请注意,我将我糟糕的项目设计归咎于 nhibernate)。这里是:

在我的域模型中,我有以下内容(为了简单起见,我删掉了很多多余的部分):

一个事件对象:

public class EventBO 
{

    public int ID { get; set; }

    public String Name
    {
        get;
        set;
    }

    private List<InviteeBO> _invitees = null;

    public List<InviteeBO> Invitees
    {
        get { return _invitees; }
        set { _invitees = value; }
    }
}

还有一个被邀请对象:

public class InviteeBO 
{

    public int ID { get; set; }

    public String Name
    {
        get;
        set;
    }

    private List<InviteeBO> _invitees = null;

    public List<InviteeBO> Invitees
    {
        get { return _invitees; }
        set { _invitees = value; }
    }

    private EventBO theEvent;

    public EventBO TheEvent
    {
        get { return theEvent; }
        set { theEvent = value; }
    }

    private InviteeBO invitedByUser = null;

    public InviteeBO InvitedByUser
    {
        get { return invitedByUser; }
        set { invitedByUser = value; }
    }
}

创建事件时,创建它的人会自动添加到 Event.Invitees 列表中。然后,同一个人可以添加无限数量的受邀者,然后将其添加到刚刚添加到事件中的受邀者对象内的受邀者列表中。这样做的原因是因为我不仅需要跟踪谁被添加到事件中,还需要跟踪谁添加了谁。

我的问题是:当我保存一个事件时,EventID 会添加到事件的受邀者列表(在受邀者数据库表中)中存在的每个受邀者的数据库中的相应列中。此外,如果该 Event.Invitees 列表中的被邀请者邀请朋友(因此将被邀请者添加到其各自的 Invitee.Invitees 列表中),则保存事件将正确写入向他邀请的所有被邀请者发出邀请的被邀请者的 InviteeID(也在受邀者数据库表中)。问题:EventID 未添加到 Event.Invitees 列表中所有 Invitees 的子 Invitees。

上帝...我在解释这个方面做得很糟糕,我很抱歉。我可以在这里提供无限的细节,但我不想让这篇文章超载。如果您需要其他任何东西来帮助我解决这个问题,请告诉我。

无论如何,这里是事件和被邀请者映射文件的相关部分:

Event.hbm.xml:

<?xml version="1.0" encoding="utf-8" ?>
<hibernate-mapping xmlns="urn:nhibernate-mapping-2.2"
                   assembly="DAL"
                   namespace="DAL.DAO.Entities">
  <class name="EventDO" table="Events">
    <id name="ID">
      <column name="ID"/>
      <generator class="native" />
    </id>
    <property name="Name">
      <column name="Name"/>
    </property>
    <property name="Description">
      <column name="Description"/>
    </property>    
    <bag name="Invitees" table="Invitees" inverse="false" cascade="all" lazy="false" >
      <key column="EventID"/>
      <one-to-many class="InviteeDO" />
    </bag>

  </class>
</hibernate-mapping>

受邀者.hbm.xml:

<?xml version="1.0" encoding="utf-8" ?>
<hibernate-mapping xmlns="urn:nhibernate-mapping-2.2" assembly="DAL" namespace="DAL.DAO.Entities" >
  <class name="InviteeDO" table="Invitees">
    <id name="ID">
      <generator class="identity"/>
    </id>
      <property name="FullName"/>
      <many-to-one name="TheEvent"  cascade="none" column="EventID" lazy="false" />
      <bag name="Contacts" table="Contacts" inverse="false" cascade="all" lazy="false" >
        <key column="ContactOfUserID"/>
        <one-to-many class="ContactDO" />
      </bag>
      <bag name="Invitees" table="Invitees" inverse="false" cascade="save-update" lazy="false" >
        <key column="InvitedByID" />
        <one-to-many class="InviteeDO"/>
      </bag>
      <property name="IsOrganizer"/>
      <property name="IsCreator"/>


  </class>
</hibernate-mapping>

更新 @Roberto Hernandez - 首先,感谢您的回复。我真的,真的很感激。

其次,带头并仅使用我的 DAL 和 DO 进行了测试,并且成功了。很明显,将我的 DO 转换为 BO 的功能有问题。

您还指出了我做错的其他事情。我已将孩子受邀者添加到父受邀者中,并将父受邀者添加到 event.Invitees。然后我假设保存该事件将执行所有必要的持久性,包括儿童受邀者。显然我错了,我还需要将 parentInvitee 添加到孩子,并将孩子添加到 Event.Invitees。谢谢!

【问题讨论】:

  • 很高兴听到一切正常!

标签: c# asp.net nhibernate design-patterns nhibernate-mapping


【解决方案1】:

我认为您上面概述的代码没有什么特别的问题,我的意思是有一些可能的改进,但我认为您主要是假设 NHibernate 会做更多目前正在为您做的事情。我使用您的代码和映射构建了一个应用程序,只要我明确设置您上面提到的属性,一切都会按预期工作。以下是sn-p。

// This is my SessionFactory (Not Relevant!)
using (var session = NhSessionFactory.GetSession(generatedatabase: false))
{
using (var tran = session.BeginTransaction())
{
    var theEvent = new EventBO();
    theEvent.Name = "EventName";

    var parentInvitee = new InviteeBO();
    parentInvitee.Name = "Parent";
    theEvent.Invitees.Add(parentInvitee);

    for (int index = 0; index <= 5; index++)
    {
        var childInvitee = new InviteeBO();
        childInvitee.Name = string.Format("Child {0}", index);
        childInvitee.InvitedByUser = parentInvitee;  // Adding invited by user.

        parentInvitee.Invitees.Add(childInvitee);
        theEvent.Invitees.Add(childInvitee);   // Adding child invitees to Event.
    }

    session.SaveOrUpdate(theEvent);
    tran.Commit();
}
}

虽然上面的代码有效,但我建议将所有这些重构到您的 BO 对象中。例如,将 AddInvitee 方法添加到处理子对象中属性设置的 Event 类。

警告:您似乎有一个映射层,您没有向我们展示它处理从 BO 到 DO 的映射我在不知道您在该层中有什么的情况下以我能做到的最好方式回答。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2010-10-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多