假设我有一个带有下一个映射的父集合:
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剖析器建议的那样。
答案 0 :(得分:1)
如果我正确理解了您的问题,您有一个A代理列表,并希望为每个A添加一个或多个B。如果不是这样,请向我们展示您加载/创建As并添加Bs的代码。
只要您调用任何公共方法,就会加载您的A代理。在您的情况下,这很可能是AddBEntity
方法或Bs
属性获取者。 NHibernate无法知道你想在那些方法和属性中做什么,因此总是必须初始化代理。
我现在还不完全确定,但我认为您可以通过执行以下操作来插入新的B而无需加载A代理。基本上只是确保你永远不会在A代理上调用方法。
B newB = new B();
newB.A = someAProxy;
session.Save(newB);