HasOne vs References Mapping Fluent NHibernate

时间:2010-03-04 21:46:14

标签: nhibernate fluent-nhibernate nhibernate-mapping

这是我第一次使用FluentNhibernate Mapping并面临如何引用另一个表的问题。任何帮助表示赞赏:

我有几个名为CD_ varname 的表,所有这些表都包含两列 - CODE和DESCR。

我有一个主表,名为收件人,它有两列,称为ALIVE和SEX,两者都是类型编号,它们引用表CD_ALIVE和CD_SEX。 如果收件人中的Alive = 1,那么我们需要从CD_ALIVE表中获取代码和descr,其中Code = 1.

我已经描述了一个Codef类:

public Class Codef
{
    int Code { get; set; }
    string Descr { get; set; }
}

我的收件人类将这些分配给组件。收件人类看起来像这样:

 public Class IRecepient
{
    int ID { get; set; }
    Birth Birth {get; set;}
    Death Death { get; set; }
}

我的出生和死亡课程是:

public Class Birth
{
    DateTime BDate { get; set; }
    Codef Sex { get; set; }
    Codef Ethnicity { get; set; } //CD_ETHNICITy Table
    Codef Race { get; set; } //CD_RACE Table
}

和我的死亡班:

public Class Death
{
    DateTime DeathDate { get; set; }
    Codef Alive { get; set; }
}   

所以,收件人中的主要栏目“Alive”实际上是引用我的Recipient.Death.Alive.Code

我有一个codef映射类:

   public CodefMapping()
         {
             Map(x => x.Code, "CODE");
             Map(x => x.Descr, "DESCR");
         }

我正在尝试进行收件人映射,这就是我被困住的地方。我可以这样做:

 HasOne<CodefMapping>(c => c.Death.Alive)
                    .PropertyRef(c => c.Code)
                    .PropertyRef(c => c.Descr)
                    .WithForeignKey("ALIVE");

不能正常工作:( 非常感谢任何帮助。

谢谢。

2 个答案:

答案 0 :(得分:18)

我认为你想使用References映射

HasOne表示您映射在一起的2个实体共享一个“互斥”标识符

http://jagregory.com/writings/i-think-you-mean-a-many-to-one-sir/

答案 1 :(得分:1)

References用于属性映射。

public DeathMap()
{
    References( x => x.Alive );        
}

您需要Id代码。

public CodefMapping()
{
    Id(x => x.Code);
    Map(x => x.Descr);
}

默认约定是列名称与属性名称匹配,因此除非列名称不同,否则不必指定列名称。