NHibernate懒惰的双向地图用于层次结构

时间:2014-05-14 12:33:49

标签: nhibernate nhibernate-mapping

我有以下域模型结构:

class A
{
    public virtual int Id { get; set;}
    public virtual B1 B1 { get; set;}
    public virtual B2 B2 { get; set;}
}

class B
{
    public virtual int Id { get; set;}
    public virtual string Discriminator { get; set;}
    public virtual A A { get; set;}
}

class B1 : B
{
}

class B2 : B
{
}

数据库表结构:

A_table (Id)
B_table (Id, Discriminator, AId);

其中列AId是可以为空的外键。

那么如何在NHibernate中创建双向地图(按代码映射),使用懒惰的B1,B2链接?

UPD1: 如果我在映射配置中设置property-ref,双向映射工作正常,但链接不是懒惰的:

<one-to-one name="B1" cascade="all" property-ref="A" />
<one-to-one name="B2" cascade="all" property-ref="A" />

有什么想法在这种情况下如何设置懒惰?

1 个答案:

答案 0 :(得分:0)

你不能!!!

原因如下:

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

    // As you don't have a B1Id column, this is a OneToMany relation (a List, Set, etc)
    public virtual B1 B1 { get; set; }

    // As you don't have a B2Id column, this is a OneToMany relation (a List, Set, etc)
    public virtual B2 B2 { get; set; }
}

您要做的是 OneToOne 映射,为此, A B 表必须具有相同的 Id (这是 OneToOne )。

如果两个实体在没有 OneToOne 关系的情况下相互引用,则实际上有一个列表。正如您的模型所示:

A_table (Id)
B_table (Id, Discriminator, AId);

A 表与 B 的关系为0..n。

请注意以下SQL:

INSERT INTO A_table (Id) VALUES (1)
INSERT INTO B_table (Id, Discriminator, AId) VALUES (1, 'B1', 1)
INSERT INTO B_table (Id, Discriminator, AId) VALUES (2, 'B1', 1)
INSERT INTO B_table (Id, Discriminator, AId) VALUES (3, 'B2', 1)
INSERT INTO B_table (Id, Discriminator, AId) VALUES (4, 'B2', 1)

如您所见, A.B1 A.B2 都有两个值。