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

我猜想显式多态性仅用于查询,而不用于 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 回答
2

好的。我懂了。正如 Stefan 所说,我制作了抽象的 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)

它只产生一个连接(TestBase join TestBase)。所以现在我可以从 db 获取我的 TestBase 而无需开销。我不喜欢 hack,但如果内置逻辑不起作用(多态 = 显式),那么剩下要做的事情。

于 2012-09-14T17:41:08.083 回答