我有这种一对多的关联,我用'老'nhibernate或流利创造了zilions次.但我无法使用代码映射
这些是课程
public class Parent
{
public virtual IList<Child> Children { get; set; }
}
public class Child
{
public virtual Parent Parent { get; set; }
}
Run Code Online (Sandbox Code Playgroud)
没什么奇怪的
这些是映射类
对于家长:
Bag(x => x.Parent, m => m.Key(k => k.Column("Parent_id")));
Run Code Online (Sandbox Code Playgroud)
儿童:
ManyToOne(x => x.Children, map => { map.Column("Parent_id"); map.Cascade(Cascade.All); });
Run Code Online (Sandbox Code Playgroud)
如果我做以下事情
var parent = new Parent();
parent.Children.Add(new Child());
session.SaveOrUpdate(parent);
Run Code Online (Sandbox Code Playgroud)
我为父级提供了正确的INSERT,但它为所添加的任何子级进行了更新
UPDATE TableChildren
......
WHERE Id = 0 <-????
Run Code Online (Sandbox Code Playgroud)
我错过了什么?我在敲我的头!
我看到两个问题.映射似乎倒(Bag应该去Children,ManyToOne一个Parent).这里的基本设置也是inverse="true".
详细记录如下:
儿童应该像这样映射:
Bag(x => x.Children, m =>
m.Inverse(true);
m.Cascade(Cascade.All);
m.Key(k => k.Column("Parent_id")));
Run Code Online (Sandbox Code Playgroud)
和父母一样
ManyToOne(x => x.Parent, map =>
{
map.Column("Parent_id");
});
Run Code Online (Sandbox Code Playgroud)
这inverse="true"是一种如何指导NHibernate的方式,每个孩子都可以自我管理.所以,一旦孩子被添加到Children集合中,我们也必须设置它Parent!然后NHibernate将在一步中使用正确的引用INSERT子进程.