首页 文章

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

提问于
浏览
0

我有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; }
}

和映射:
child

public ChildMap()
        {
            Map(x => x.Number).Not.Nullable();
            References(x => x.Parent).Nullable().LazyLoad().Cascade.None();
        }

parent

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();

在post -1426152_
但是像这样插入链接 test.Orders.Add(new Order("test") { Company = test }); 绝对 not true 方式,所以我需要帮助,任何想法?

3 回答

  • 1

    您在 ParentChild 之间设置了双向关系,但是当您在 Parent 上将子项添加到 Children 集合时,您没有在每个子项上设置 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);
    }
    
  • 0

    改成:

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

    答案是

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

    Without inverse

相关问题