Fluent NHibernate HasMany映射在外键中插入null

时间:2013-04-30 09:58:11

标签: c# fluent-nhibernate foreign-keys mapping fluent-nhibernate-mapping

我有两个实体:

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 });绝对不真实方式的链接,所以我需要帮助,任何想法?

3 个答案:

答案 0 :(得分:1)

您在ParentChild之间设置了双向关系,但是当您将一个孩子添加到Children上的Parent集合时,您没有设置每个孩子的Parent财产。

我建议的第一件事就是质疑这种关系是否需要双向 - 典型的使用方式是否与儿童无关?您是否需要按ChildParent的方向导航对象图? ParentChild 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();
    }

没有反向