我只想尝试使用流畅的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
答案 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();