1

假设我有一个带有下一个映射的父集合:

public class A : Entity<A>
{
    private readonly IList<B> _bs = new List<B>(); 
    public virtual string AProp { get; set; }
    public A(string aprop)
    {
        AProp = aprop;
    }
    protected A()
    {
    }

    public virtual IEnumerable<B> Bs
    {
        get { return _bs; }
    }

    public virtual void AddBEntity(B bEntity)
    {
        bEntity.A = this;
        _bs.Add(bEntity);
    }
}

    public class AMap : EntityMap<A>
    {
        public AMap()
        {
            Map(x => x.AProp).Not.Nullable();
            HasMany(x => x.Bs)
                .Access.ReadOnlyPropertyThroughCamelCaseField(Prefix.Underscore)
                .Inverse().Cascade.All().AsBag();
        }
    }

以及下一个子类及其映射:

    public class B: Entity<B>
        {
            public virtual string BProp { get; set; }
            public virtual A A { get; set; }
        }

        public class BMap : EntityMap<B>
        {
            public BMap()
            {
                Map(x => x.BProp).Not.Nullable();
                References(x => x.A).Cascade.All();
            }
 }

假设我需要将孩子添加到现有的父母。我希望在 SQL 中插入一个已知的子节点值和父节点的 id。我尝试了不同的映射方法,但我不明白为什么要加载代理的 A 对象来添加孩子,因为 NH 分析器建议我这样做。

在此处输入图像描述

4

1 回答 1

1

如果我正确理解您的问题,您有一个 A 代理列表,并希望为每个 A 添加一个或多个 B。如果这不是真的,请向我们展示您加载/创建 As 并添加 B 的代码。

只要您在其上调用任何公共方法,您的 A 代理就会被加载。在您的情况下,这很可能是AddBEntity方法或Bs属性获取器。NHibernate 不知道你想在那些方法和属性中做什么,因此总是必须初始化代理。

我现在不完全确定,但我认为您可以通过执行以下操作来插入新的 B 而无需加载您的 A 代理。基本上只要确保你永远不会在 A 代理上调用方法。

B newB = new B();
newB.A = someAProxy;
session.Save(newB);
于 2013-05-06T13:33:31.317 回答