【发布时间】:2014-01-02 20:52:31
【问题描述】:
我有一张食谱表。每个配方在表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 喜欢 默认行为的方式。我应该屈服并让它顺其自然吗?
如果我不想更改数据库(尽管如果有正当理由,我可以说服我这样做),如何使用此模型创建所需的一对一映射?
【问题讨论】:
标签: c# sql nhibernate fluent-nhibernate