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

和映射:
孩子

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

4

3 回答 3

1

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

我建议的第一件事是质疑这种关系是否需要是双向的——典型的用法是否适用于独立于父母的孩子?您是否需要在 fromChild到的方向上导航对象图Parent?两者都是ParentChild 聚合根

有几种不同的方法来处理双向关系。一种方法是定义 Add 和 Remove 方法,将 a 添加ChildChildren集合并设置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);
}
于 2013-04-30T10:11:03.473 回答
0

答案是

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

无逆

于 2013-05-07T07:51:26.323 回答
0

改成:

Enumerable.Range(0, 100).Select(s => new Child()
    {
        Number = s.ToString(),
        Parent = p
    }).ToList().ForEach(p.Children.Add);
于 2013-04-30T10:01:20.580 回答