【问题标题】:NHibernate bi-directional associationNHibernate 双向关联
【发布时间】:2012-03-28 17:03:07
【问题描述】:

我正在尝试对父/子关联建模,其中父类 (Person) 拥有子类 (OwnedThing) 的许多实例 - 我希望在保存 Person 类时自动保存 OwnedThing 实例,并且我想要关联是双向的。

public class Person
{
        public class MAP_Person : ClassMap<Person>
        {
                public MAP_Person()
                {
                        this.Table("People");
                        this.Id(x => x.ID).GeneratedBy.GuidComb().Access.BackingField();
                        this.Map(x => x.FirstName);
                        this.HasMany(x => x.OwnedThings).Cascade.AllDeleteOrphan().KeyColumn("OwnerID").Inverse();
                }
        }

        public virtual Guid ID { get; private set; }
        public virtual string FirstName { get; set; }
        public virtual IList<OwnedThing> OwnedThings { get; set; }

        public Person()
        {
                OwnedThings = new List<OwnedThing>();
        }
}



public class OwnedThing
{
        public class MAP_OwnedThing : ClassMap<OwnedThing>
        {
                public MAP_OwnedThing()
                {
                        this.Table("OwnedThings");
                        this.Id(x => x.ID).GeneratedBy.GuidComb().Access.BackingField();
                        this.Map(x => x.Name);
                        this.References(x => x.Owner).Column("OwnerID").Access.BackingField();
                }
        }

        public virtual Guid ID { get; private set; }
        public virtual Person Owner { get; private set; }
        public virtual string Name { get; set; }
}

如果我将 Person.OwnedThings 设置为 Inverse,则在保存 Person 时不会保存 OwnedThing 实例。如果我不添加 Inverse 则保存成功,但 person.OwnedThings[0].Owner 在我从数据库中检索后始终为空。

更新 保存数据时,NHibernate 将在数据库中设置单个关联端,因为它是通过关联的多端设置的,所以当我从数据库中检索 OwnedThing 时,它确实有返回到的链接人集。我的空引用来自 Envers,它似乎没有做同样的事情。

【问题讨论】:

    标签: nhibernate fluent-nhibernate


    【解决方案1】:

    我是否正确理解您的问题,您的问题仅发生在 nhibernate envers 读取的“历史”实体上?

    如果是这样,它可能是由这个错误引起的 https://nhibernate.jira.com/browse/NHE-64 目前的解决方法是使用 Merge 而不是 (SaveOr)Update。

    【讨论】:

      【解决方案2】:

      OwnedThings[0].Owner 很可能为 null,因为您在添加时没有设置它。使用双向关系时,您必须执行以下操作:

      Person person = new Person();
      OwnedThing pwnedThing = new OwnedThing();
      
      pwnedThing.Owner = person;
      person.OwnedThings.Add(pwnedThing);
      

      如果您没有明确设置pwnedThing.Owner,并且您在同一ISession 中查询您创建它的同一对象,则该对象将为空。通常,我添加或删除为我执行此“额外”工作的方法。举个例子:

      public class Order : Entity
      {
          private IList<OrderLine> orderLines;
          public virtual IEnumerable<OrderLine> OrderLines { get { return orderLines.Select(x => x); } }
      
          public virtual void AddLine(OrderLine orderLine)
          {
              orderLine.Order = this;
              this.orderLines.Add(orderLine);
          }
      
          public virtual void RemoveLine(OrderLine orderLine)
          {
              this.orderLines.Remove(orderLine);
          }
      }
      
      public class OrderMap : ClassMap<Order>
      {
          public OrderMap()
          {
              DynamicUpdate();
              Table("ORDER_HEADER");
              Id(x => x.Id, "ORDER_ID");
      
              HasMany(x => x.OrderLines)
                  .Access.CamelCaseField()
                  .KeyColumn("ORDER_ID")
                  .Inverse()
                  .Cascade.AllDeleteOrphan();
          }
      }
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2010-11-25
        • 1970-01-01
        • 2016-07-26
        • 1970-01-01
        • 2013-03-07
        • 1970-01-01
        相关资源
        最近更新 更多