流利的NHibernate - 一到一个(1 - 0..1)关系

时间:2012-10-01 11:28:41

标签: c# nhibernate fluent-nhibernate fluent-nhibernate-mapping

我只想尝试使用流畅的NHibernate在不使用私人收藏的情况下映射1 - 0..1(一个到最多一个\一个到零或一个)关系。类结构的一个例子如下:

    public class ClassA
    {
        public int ClassAId { get; set; }

        public string SomeDetails { get; set; }

        public ClassB ClassB { get; set; }

    }

    public class ClassB
    {
        public ClassA ClassA { get; set; }

        public int ClassBId { get; set; }

        public string SomeChildDetails { get; set; }
    }

在此示例中,ClassA可以具有ClassB,或者ClassB可以为null。

DB结构看起来像:

   ClassA Table
   -------------
   int ClassA_ID  PK
   string SomeDetails

   ClassB Table
   ------------
   int ClassA_Id   PK  FK
   string SomeChildDetails

在这种情况下,你不能使用HasOne(x => x.ClassB).Cascade.All();因为这假定它必须始终有一个。

如果没有与ClassA上的私有IList建立一对多关系并且让ClassB属性的getter获取列表中的第一个条目,是否有办法实现此目的。

TA

[R

1 个答案:

答案 0 :(得分:2)

除了将映射上的所有属性标记为virtual之外,References应该可以做到这一点:

References(x => x.ClassB).Nullable().Cascade.All();

Fluent NHibernate的文档说它相当于多对一关系,但也适用于单个属性,最终成为1-0..1的关系。 您可以使用HasOne修饰符来尝试Nullable(),但是在文档中您通常 应该使用References代替。

[编辑评论]:

据我记忆,NHibernate的默认外键命名策略是keyname_id,您可以通过实现自己的ForeignKeyConvention来更改(这一个适用于所有映射)。假设你的外键策略是TableNameID,它将是'ClassBID':

internal class MyFkeyConvention : ForeignKeyConvention
{
    protected override string GetKeyName(FluentNHibernate.Member property, Type type)
    {
        if(property != null)
            return property.Name + "ID";
        return type.Name + "ID";
    }
}

或者只在一个地方使用它时才使用它:

References(x => x.ClassB).Column("YourForeignKeyColumnName").Nullable().Cascade.All();