簡體   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