我有以下域模型结构:
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" />
有什么想法在这种情况下如何设置懒惰?
答案 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 都有两个值。