4

NH 3.3.1 を使用しています。単純なクラスを仮定します:

public class TestBase
{
    public virtual int Id { get; set; }

    public virtual string A { get; set; }
}

public class Test : TestBase
{
    public virtual string B { get; set; }
}

およびそれらのマッピング:

public sealed class TestBaseMap : ClassMap<TestBase>
{
    public TestBaseMap()
    {
        this.Polymorphism.Explicit();
        this.Id(a => a.Id).GeneratedBy.Identity();
        this.Map(a => a.A);
    }
}

public sealed class TestMap :SubclassMap<Test>
{
    public TestMap()
    {
        this.Map(a => a.B);
    }
}

Polymorphism.Explicit() が指定されていても、NH は TestBase を照会するときに Test を結合したままです。

var a = this.Session.Get<TestBase>(1);

サブクラスがたくさんあるので、この参加は本当に必要ありません。fluent で生成された xml を確認しました。大丈夫です、「明示的な」句があります。私は何を間違っていますか?

4

2 に答える 2

2

Ok。私はそれを持っている。ステファンが推測したように、抽象的な TestBase を作成しました。しかし、多くの左結合なしで TestBase テーブルをクエリする必要があったため、スタブ クラスを導入しました。

public class TestStub : TestBase
{
    // nothing   
}

このクラスは完全に空です。地図:

public sealed class TestStubMap : SubclassMap<TestStub>
{
    public TestStubMap()
    {
        this.Table("TestBase");
        this.KeyColumn("Id");
    }
}

これで、次のクエリを実行できます。

var a = this.Session.Get<TestStub>(1)

結合は 1 つだけ生成されます (TestBase 結合 TestBase)。これで、オーバーヘッドなしで db から TestBase を取得できるようになりました。ハッキングは好きではありませんが、組み込みのロジックが機能しない場合 (ポリモーフィズム = 明示的)、やるべきことは残っています。

于 2012-09-14T17:41:08.083 に答える
2

明示的なポリモーフィズムは、session.Get ではなく、クエリでのみ使用されると思います。しかし、これに関する参考文献は見つかりませんでした。


基本クラスを照会しないようにしますが、常に具体的なサブクラスを用意してください (ほとんどの場合、いずれにせよより優れた設計です)。

public abstract class TestBase
{
    public virtual int Id { get; set; }

    public virtual string A { get; set; }
}

public class TestA : TestBase
{
    public virtual string B { get; set; }
}

public class TestB : TestBase
{
    public virtual string B { get; set; }
}

var a = this.Session.Get<TestA>(1);
于 2012-09-13T13:58:15.833 に答える