繁体   English   中英

使用Fluent NHibernate进行一对一关系的正确设计是什么?

[英]What's the proper design for a one-to-one relationship using Fluent NHibernate?

我有一张食谱表。 每个配方在表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这是错误的吗? 显然,我具有FK约束以及RecipeMetadata.RecipeId上的唯一索引,因此不会影响性能。 是的,磁盘上还有一些额外的字节,可以在此表上存储不必要的ID。

  2. 我从未见过一个表,该表的主键在另一个表上也具有外键约束。 这是合法的做法吗? 这似乎是nHibernate在默认情况下更喜欢表现的方式。 我应该让它让路吗?

  3. 如果我不想更改数据库(虽然可以说服我,但如果有正当的理由也可以这么做),那么如何使用此模型创建所需的一对一映射?

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

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

另请参阅: 有关该主题的Ayende帖子

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM