[英]What's the proper design for a one-to-one relationship using Fluent NHibernate?
我有一张食谱表。 每个配方在表RecipeMetadata中只有一行,其中包含关于配方的各种数据,出于各种原因,这些数据我不想存储在Recipes
表中。 因此, Recipes
和RecipeMetadata
具有一对一的映射。 我的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
我的问题:
我是否希望RecipeMetadata
具有自己的唯一ID,并使用单独的列将此链接到Recipes
这是错误的吗? 显然,我具有FK约束以及RecipeMetadata.RecipeId
上的唯一索引,因此不会影响性能。 是的,磁盘上还有一些额外的字节,可以在此表上存储不必要的ID。
我从未见过一个表,该表的主键在另一个表上也具有外键约束。 这是合法的做法吗? 这似乎是nHibernate在默认情况下更喜欢表现的方式。 我应该让它让路吗?
如果我不想更改数据库(虽然可以说服我,但如果有正当的理由也可以这么做),那么如何使用此模型创建所需的一对一映射?
NHibernate对一对一关系有严格的定义。 严格但公平。 在NHibernate中,一对一关系意味着表A中的行始终在表B中具有匹配的行。
另请参阅: 有关该主题的Ayende帖子 。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.