gpt4 book ai didi

c# - Fluent NHibernate - 一对至多一 (1 – 0..1) 关系

转载 作者:行者123 更新时间:2023-12-04 05:30:35 25 4
gpt4 key购买 nike

我只是想弄清楚是否可以在不使用私有(private)收藏的情况下使用流利的 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 上的私有(private) IList 建立一对多关系并且让 ClassB 属性的 getter 获得列表中的第一个条目。



R

最佳答案

除了将映射上的所有属性标记为 virtual , References应该做的伎俩:

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

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

关于c# - Fluent NHibernate - 一对至多一 (1 – 0..1) 关系,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12672389/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com