簡體   English   中英

實體框架-如何在類層次結構中避免TPC

[英]Entity Framework - How to avoid TPC in a class hierarchy

在我的業務領域中,我有兩個實體,它們作為對象根據它們公開的屬性定義層次結構關系,但是在數據庫級別上,它們是非常不同的。

具體來說,我所擁有的是一個Image類,它定義了屬性A和B(在ID旁邊)以及一些簡單的方法。 然后,我有一個Thumbnail類,它與Image完全相同。

在OOP透視圖中,使Thumbnail從Image繼承是合乎邏輯的。 但是,在Db級別上,這兩個實體在一個重要的細節上有所不同:Image向另一個表聲明FK,而Thumbnail沒有。

實際上,“圖像”定義了一個產品(例如)可以具有的圖像集(“一對多”),而“縮略圖”定義了同一產品可以具有的“唯一圖像”(“一對零”)。 在這種情況下,縮略圖將不在圖像集中。

因此,在數據庫中,“圖像”表應具有A,B,Id和FK到產品的列,而“縮略圖”表應僅具有A,B和Id列(也將是到產品的FK)。

如果我首先使用EF Code對此模型進行建模,那么(最好)將為Image生成一個表,然后為Thumb表生成一個表,並在Image和Thumbnail之間建立一對一或零對一的關聯。 這種關聯是我要避免的一種關聯,因為添加縮略圖時,我還必須將其添加為圖像,然后設置FK,這是不可能的,因為沒有縮略圖。

如果我明確指定生成TPC,則它不允許我在“產品與圖像”之間建立關聯,因為關聯只能在大多數派生類型中定義。

你有什么想法?

您需要配置您的實體,以便它們使用Map-Table-Per-Concrete類(TPC)繼承

在TPC映射方案中,層次結構中的所有非抽象類型都映射到各個表。 映射到派生類的表與映射到數據庫中基類的表沒有關系。 類的所有屬性(包括繼承的屬性)都映射到相應表的列。

這是使用TPC的可能配置的示例::

modelBuilder.Entity<Image>() 
  .Property(c => c.ImageID) 
  .HasDatabaseGeneratedOption(DatabaseGeneratedOption.None); 

modelBuilder.Entity<ThumbNail>().Map(m => 
{ 
    m.MapInheritedProperties(); 
    m.ToTable("Thumbnails");
}); 

您必須針對特定目的對其進行微調。 例如,使用以下命令排除FK屬性:

modelBuilder.Entity<Thumbnail>().Ignore(p => p.FkProperty);

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM