[英]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.