[英]Fluent nHibernate - Mapping Children with Composite Keys Yielding Null References
給出一個簡單的父 - >子(CK,CK)這樣的設置..我在添加一個新的子對象並獲得父引用時遇到了麻煩。 所以我會以這種方式添加對象..
var parent = new Parent{
Children = new List<Child>{
new Child{
Other = otherReference
}
}
};
甚至使用Add()
方法添加它...
parent.Children.Add(new Child {Other = other});
對Parent
的引用沒有得到推進。 它最終只是一個null屬性。 我得到以下異常。
{“無法將值NULL插入列'ParentId',表'mssql_test.Children';列不允許空值.INSERT失敗。\\ r \\ n語句已終止。”}
我能做到這一點......
new Child {
Parent = parentReference,
Other = otherReference
}
但這似乎有點多余。 我的理解是它應該能夠自己推斷出引用。 如果這是不可能的,也許我只是誤解。 誰能幫我? 我在下面概述了我的代碼。
class Parent {
int Id { get; set; }
IList<Child> Children { get; set; }
}
class Other {
int Id { get; set; }
}
class Child {
Parent Parent { get; set; }
Other Other { get; set; }
// other properties
}
ChildMap() {
CompositeId()
.KeyReference(x => x.Parent, "ParentId")
.KeyReference(x => x.Other, "OtherId");
}
ParentMap(){
HasManyToMany(x => x.Children)
.AsBag()
.ChildKeyColumns.Add(new[] { "ParentId", "OtherId" })
.Inverse()
.Cascade.All())
.Table("[Test]");
}
正如@KeithS指出的那樣,問題是你將Child集合映射為HasManyToMany,它應該是HasMany。 以下是映射的外觀:
ChildMap() {
CompositeId() //This is is good
.KeyReference(x => x.Parent, "ParentId")
.KeyReference(x => x.Other, "OtherId");
}
ParentMap(){ //This is the fix
HasMany(c => c.Children)
.Inverse()
.Cascade.All()
.KeyColumn("ParentId") //Not needed if Parent Id prop maps to ParentId col
.Table("[Test]");
}
您沒有將Parent映射為Child的屬性。 NHibernate(和FluentNH)只映射你告訴他們的內容; 你可以在你的對象上有十幾個字段,但是如果你只映射其中一個字段,這就是NH為你提供實例時所提供的所有字段。 您應該在映射中為Parent添加“References”方法,將Parent的鍵字段指定為FK引用。 這應該為您提供對象層次結構中的“反向引用”。
而且,在Parent方面看起來不是多對多,你應該只有一對多(使用HasMany)。 父母可以有很多孩子,但是孩子只有一個孩子。 ManyToMany可能有效,但它在Parent和Child之間創建了一個冗余的交叉引用表。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.