NHibernate双向关联

NHibernate双向关联,nhibernate,fluent-nhibernate,Nhibernate,Fluent Nhibernate,我试图对父/子关联建模,其中父类(Person)拥有子类(OwnedThing)的多个实例-我希望保存Person类时自动保存OwnedThing实例,并且我希望关联是双向的 public class Person { public class MAP_Person : ClassMap<Person> { public MAP_Person() {

我试图对父/子关联建模,其中父类(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; }
}
公共类人物
{
公共类映射\人:类映射
{
公共地图(人)
{
这张桌子(“人”);
this.Id(x=>x.Id).GeneratedBy.GuidComb().Access.BackingField();
this.Map(x=>x.FirstName);
this.HasMany(x=>x.OwnedThings).Cascade.AllDeleteOrphan().KeyColumn(“OwnerID”).Inverse();
}
}
公共虚拟Guid ID{get;private set;}
公共虚拟字符串FirstName{get;set;}
公共虚拟IList拥有的内容{get;set;}
公众人士()
{
OwnedThings=新列表();
}
}
公共类拥有的东西
{
公共类映射\您拥有的内容:类映射
{
公共地图
{
本表(“自有物品”);
this.Id(x=>x.Id).GeneratedBy.GuidComb().Access.BackingField();
this.Map(x=>x.Name);
this.References(x=>x.Owner).Column(“OwnerID”).Access.BackingField();
}
}
公共虚拟Guid ID{get;private set;}
公共虚拟人所有者{get;private set;}
公共虚拟字符串名称{get;set;}
}
如果我将Person.OwnedThings设置为反向,则在保存Person时不会保存OwnedThing实例。如果我不添加反转,则保存成功,但person.OwnedThings[0]。从数据库检索后,Owner始终为null

更新
当保存数据时,NHibernate将在数据库中设置单个关联端,因为它是通过关联的多个端设置的,因此当我从数据库中检索OwnedThing时,它会将链接返回到Person set。我的null引用来自Envers,它似乎没有做相同的事情。

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();
    }
}
公共类顺序:实体
{
私人IList订单线;
公共虚拟IEnumerable订单行{get{return OrderLines.Select(x=>x);}
公共虚拟无效添加行(订单行订单行)
{
orderLine.Order=this;
this.orderLines.Add(orderLine);
}
公共虚拟void RemoveLine(订单行订单行)
{
this.orderLines.Remove(orderLine);
}
}
公共类OrderMap:ClassMap
{
公共秩序地图()
{
DynamicUpdate();
表(“订单标题”);
Id(x=>x.Id,“订单Id”);
HasMany(x=>x.OrderLines)
.Access.CamelCaseField()
.KeyColumn(“订单ID”)
.Inverse()
.Cascade.AllDeleteOrphan();
}
}

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

如果是这样的话,它可能是由这个bug引起的 目前的解决方法是使用合并而不是(保存或)更新