我有两个实体:
public class Parent
{
public virtual string Number { get; set; }
public virtual IList<Child> Children { get; set; }
public Parent()
{
Phones = new List<Child>();
}
}
public class Child
{
public virtual string Number { get; set; }
public virtual Parent Parent { get; set; }
}
和映射:
孩子
public ChildMap()
{
Map(x => x.Number).Not.Nullable();
References(x => x.Parent).Nullable().LazyLoad().Cascade.None();
}
和父级
public ParentMap()
{
Map(x => x.Number).Not.Nullable();
HasMany(x => x.Children).Inverse().Cascade.All();
}
但是当我将子项插入父项时,它在父外键中为null。
var p = rep.Get(g => g.Id == 1);
Enumerable.Range(0, 100).Select(s => new Child()
{
Number = s.ToString()
}).ToList().ForEach(p.Children.Add);
rep.Update(p);
rep.Flush();
实际上就像帖子中NHibernate fluent HasMany mapping inserts NULL Foreign key一样
但是插入像这样test.Orders.Add(new Order("test") { Company = test });
绝对不真实方式的链接,所以我需要帮助,任何想法?
答案 0 :(得分:1)
您在Parent
和Child
之间设置了双向关系,但是当您将一个孩子添加到Children
上的Parent
集合时,您没有设置每个孩子的Parent
财产。
我建议的第一件事就是质疑这种关系是否需要双向 - 典型的使用方式是否与儿童无关?您是否需要按Child
到Parent
的方向导航对象图? Parent
和Child
Aggregate Roots 都是?
处理双向关系有几种不同的方法。一种方法是定义添加和删除方法,将Child
添加到Children
集合,并为每个子项设置Parent
属性,并删除将子项直接添加到集合的功能,使其成为IEnumerable<Child>
(或IReadOnlyCollection<Child>
或类似的),例如IList<Child>
支持字段
public class Parent
{
private IList<Child> _children;
public Parent()
{
_children = new List<Child>();
}
public virtual string Number { get; set; }
public virtual IEnumerable<Child> Children { get { return _children; } }
public virtual void AddChild(Child child)
{
_children.Add(child);
child.Parent = this;
}
public virtual void RemoveChild(Child child)
{
_children.Remove(child);
child.Parent = null;
}
}
public class Child
{
public virtual string Number { get; set; }
public virtual Parent Parent { get; set; }
}
应修改ParentMap以使用支持字段
public ParentMap()
{
Map(x => x.Number).Not.Nullable();
HasMany(x => x.Children).Inverse()
.Cascade.All()
.Access.CamelCaseField(Prefix.Underscore);
}
答案 1 :(得分:0)
更改为:
Enumerable.Range(0, 100).Select(s => new Child()
{
Number = s.ToString(),
Parent = p
}).ToList().ForEach(p.Children.Add);
答案 2 :(得分:0)
答案是
public ParentMap()
{
Map(x => x.Number).Not.Nullable();
HasMany(x => x.Children).Cascade.All();
}
没有反向