gpt4 book ai didi

c# - 使用 Fluent NHibernate 的一对一关系的正确设计是什么?

转载 作者:行者123 更新时间:2023-11-30 22:10:20 24 4
gpt4 key购买 nike

我有一张食谱表。每个 Recipe 在 RecipeMetadata 表中只有一行,其中包含我出于各种原因不想存储在 Recipes 表中的有关该食谱的各种数据。因此,RecipesRecipeMetadata 具有一对一的映射关系。我的Recipes 表如下:

public partial class RecipesMap : ClassMap<Recipes>
{
public RecipesMap()
{
Id(x => x.RecipeId);

// Map() various columns here

HasMany(x => x.Ingredients).KeyColumn("RecipeId");
HasOne(x => x.Metadata);
}
}

这是我的RecipeMetadata 表:

public partial class RecipeMetadataMap : ClassMap<RecipeMetadata>
{
public RecipeMetadataMap()
{
Id(x => x.RecipeMetadataId);

// Map() various columns here

References<Recipes>(x => x.Recipe).Column("RecipeId").Not.Nullable();
}
}

但是,当我加载 Recipe 并访问 Metadata 属性时,它会尝试在 RecipeMetadata 中查找 Recipes .RecipeId = RecipeMetadata.RecipeMetadataId。换句话说,它使用两个表上的主键进行连接。

对于我的表架构,RecipeMetadataId 是仅对该表唯一的键,与 RecipeId 无关。 RecipeMetadata 有另一列,也称为 RecipeId,它在“Recipes”上有一个外键约束。 JOIN 应该作为:

Recipes.RecipeId = RecipeMetadata.RecipeId

我的问题:

  1. 我希望 RecipeMetadata 拥有自己的唯一 ID,并使用单独的列将其链接到 Recipes,我错了吗?显然,我在 RecipeMetadata.RecipeId 上有一个 FK 约束和一个唯一索引,因此没有性能影响。是的,磁盘上有一些额外的字节用于存储此表上可能不必要的 ID。

  2. 我从未见过一个表的主键 在另一个表上也有外键约束。这是合法的做法吗?这似乎是 nHibernate 更喜欢默认的行为方式。我应该屈服,让它为所欲为吗?

  3. 假设我不想更改数据库(尽管如果有正当理由我可以说服我这样做),我如何才能使用此模型创建所需的一对一映射?

最佳答案

NHibernate 对一对一关系有严格的定义。严格但公平。在 NHibernate 中,一对一关系意味着表 A 中的一行在表 B 中始终具有匹配的行。

  1. 无论对错,这都不适用于 NHibernate 的一对一映射。请注意,您建议的模型与一对多关系的建模方式相同。
  2. 它是合法的并且强制执行一对一关系。
  3. 由于您希望食谱始终具有关联的元数据行,因此我将使用 NHibernate 的一对一映射对其进行建模。或者,您可以将其映射为一对多,但只将一个实例公开为属性。

另请参阅:Ayende's post on the topic .

关于c# - 使用 Fluent NHibernate 的一对一关系的正确设计是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20891651/

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