【问题标题】:Fluent NHibernate - one to at most one (1 – 0..1) RelationshipFluent NHibernate - 一对至多一 (1 – 0..1) 关系
【发布时间】:2012-09-22 05:59:52
【问题描述】:

我只是想弄清楚是否可以在不使用私人收藏的情况下使用流畅的 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 可以为空。

数据库结构类似于:

   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 获得列表中的第一个条目。

R

【问题讨论】:

  • 你不能把ID设置为int?吗?

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


【解决方案1】:

除了将映射上的所有属性标记为virtualReferences 应该可以解决问题:

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

Fluent NHibernate 的文档说它相当于多对一关系,但也适用于单个属性,最终是 1-0..1 关系。 您可以尝试使用带有Nullable() 修饰符的HasOne,但它在文档中说您通常应该改用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();

【讨论】:

  • 使用“引用”是否假​​定我的父表(在本例中为 ClassA)具有 ClassB_Id 属性?我的 NHibernate 生成的 SQL 正在寻找这个...
  • 所以,值得知道的是HasOne返回的OneToOnePart不支持Nullable。您无法通过 HasOne 完成 1..[0, 1] 关系。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-09-22
  • 2016-11-28
  • 2011-03-16
  • 1970-01-01
相关资源
最近更新 更多