【问题标题】:NHibernate lazy bidirectional map for hierarchy用于层次结构的 NHibernate 惰性双向映射
【发布时间】:2014-05-14 21:29:51
【问题描述】:

我有以下领域模型结构:

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" />

知道在这种情况下如何设置惰性吗?

【问题讨论】:

    标签: nhibernate nhibernate-mapping


    【解决方案1】:

    你不能!!!

    原因如下:

    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 映射,为此,AB 表必须具有相同的 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.B1A.B2 都有两个值。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-05-09
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多