繁体   English   中英

流利的NHibernate HasMany映射在外键中插入null

[英]Fluent NHibernate HasMany mapping inserts null in foreign key

我有2个实体:

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流利的HasMany映射中的所有内容都将插入NULL外键
但是插入像test.Orders.Add(new Order("test") { Company = test }); 绝对不是真的 ,所以我需要帮助,有什么想法吗?

您在ParentChild之间建立了双向关系,但是当您将一个孩子添加到ParentChildren集合中时,您并没有在每个孩子上设置Parent属性。

我首先建议的问题是,这种关系是否需要是双向的?通常的用法是否适用于独立于父母的孩子? 您是否需要在从ChildParent的方向上导航对象图? ParentChild 总根是否都是

有几种不同的方式来处理双向关系。 一种方法是定义Add和Remove方法,以将Child添加到Children集合中,并在每个child上设置Parent属性,并通过将其设为IEnumerable<Child> (或IReadOnlyCollection<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);
}

改成:

Enumerable.Range(0, 100).Select(s => new Child()
    {
        Number = s.ToString(),
        Parent = p
    }).ToList().ForEach(p.Children.Add);

答案是

public ParentMap()
    {
        Map(x => x.Number).Not.Nullable();
        HasMany(x => x.Children).Cascade.All();
    }

无逆

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM