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

既存の親に子を追加する必要があるとします。既知の子の値と親の ID が適切に配置された SQL への 1 つの挿入が期待されます。マッピングでさまざまなことを試しましたが、NH プロファイラーが示唆するように、子を追加するためにプロキシされた A オブジェクトをロードする理由がわかりません。

ここに画像の説明を入力

4

1 に答える 1

1

私があなたの質問を正しく理解していれば、A プロキシのリストがあり、各 A に 1 つ以上の B を追加したいと考えています。そうでない場合は、As をロード/作成して B を追加するコードを示してください。

A プロキシは、パブリック メソッドを呼び出すとすぐに読み込まれます。あなたの場合、これはおそらくAddBEntityメソッドまたはBsプロパティゲッターです。Hibernate は、そのメソッドとプロパティで何をしたいのかを知ることができないため、常にプロキシを初期化する必要があります。

今のところ完全にはわかりませんが、次のようなことを行うことで、A プロキシをロードせずに新しい B を挿入できると思います。基本的に、A プロキシでメソッドを呼び出さないようにしてください。

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