我有一个父表和子表,并且使用一对多关系来创建和映射entites。在使用Inverse()时,在一对多方面,子表的外键值将作为null插入。
public class TableA
{
public virtual long ID { get; set; }
public virtual string Name { get; set; }
public virtual IList<TableB> TableB { get; set; }
}
public class TableB
{
public virtual long ID { get; set; }
public virtual string Name { get; set; }
public virtual TableA TableA { get; set; }
}
public class TableAMap : ClassMap<TableA>
{
public TableAMap()
{
Id(x=>x.ID);
Map(x=>x.Name).Column("Name");
HasMany(x=>x.TableB)
.KeyColumn("TableA_ID")
.Inverse()
.Cascase.All()
.Not.LazyLoad();
}
}
public class TableBMap : ClassMap<TableB>
{
public TableBMap()
{
Id(x=>x.ID);
Map(x=>x.Name).Column("Name");
References(x=>x.TableA).Column("TableA_ID").Not.LazyLoad();
}
}
注意当Inverse()
从多个删除为1时,插入的新记录没有任何问题,插入外键没有任何问题,但是当我更新记录时,外键将现有记录替换为null。
请帮助我,我看了类似的问题,但它没有帮助我。
Fluent NHibernate one-to-many relationship setting foreign key to null
答案 0 :(得分:3)
请参阅此链接,该链接包含此问题的解决方案。
地图类应为:
public class TableAMap : ClassMap<TableA>
{
public TableAMap()
{
Id(x=>x.ID);
Map(x=>x.Name).Column("Name");
HasMany<TableB>(x=>x.TableB)
.KeyColumn("TableA_ID")
.Cascade.All().Inverse();
}
}
public class TableBMap : ClassMap<TableB>
{
public TableBMap()
{
Id(x=>x.ID);
Map(x=>x.Name).Column("Name");
References<TableA>(x=>x.TableA).Column("TableA_ID").Not.Nullable();
}
}
答案 1 :(得分:1)
如果没有看到插入的代码,很难确切地说出来。然而,我的水晶球告诉我你可能忘记了最后一行
Parent parent = new Parent();
Child child = new Child();
parent.Children.Add(child);
child.Parent = parent; <-- this is important because this will maintain the foreign key