3

的頂這個問題將在3類進行解釋:帳戶IndividualAccount,並醫生實體框架TPH上TPT

  • 前兩類是抽象
  • IndividualAccount是Account的子類
  • Doctor is IndividualAccount's subclass

第一層繼承(帳戶和IndividualAccount之間)正在使用表類型方法實施。 繼承的第二層(IndividualAccount和Doctor之間)正在植入表每個層次方法。

流利的API配置爲如下:

class AccountConfiguration : EntityTypeConfiguration<Account> 
    public AccountConfiguration() 
    { 
    HasKey(x => x.Id); 
    ... 
    } 
} 

class IndividualAccountConfiguration : EntityTypeConfiguration<IndividualAccount> 
{ 
    public IndividualAccountConfiguration() 
    { 
    ToTable("IndividualAccounts"); 
    ... 
    } 
} 

class DoctorConfiguration : EntityTypeConfiguration<Doctor> 
{ 
    public DoctorConfiguration() 
    { 
    ... 
    } 
} 

我們從這個配置有什麼期望是有兩個表:第一個存儲ID和公共屬性對所有用戶(如用戶名和密碼)第二個存儲所有個人共有的屬性(例如姓名和電話號碼)。此外,第二個表格將有一個區分器,用於區分醫生和我們可能在我們的域中存在的其他類型的個人。

當我試圖通過它的身份證獲得醫生時出現問題。一個會拋出異常,聲稱大量列是無效的,其中最重要的一條是:
無效的列名「鑑」 \ r \ n

令我驚訝,如果我把表(」 IndividualAccounts「)]上面的IndividualAccount類定義,問題將得到解決。但是我已經在配置中設置了表名(Fluent API)。除了Fluent API之外,爲什麼還要使用註解?

更新
在註釋的存在,醫生的屬性放置在IndividualAccounts表這的確是我們所期望的。但是,如果我刪除註釋,將會創建一個新遷移,嘗試將這些字段移動到基表帳戶

回答

1

令我驚訝的是,如果我將[Table(「IndividualAccounts」)]放在IndividualAccount類定義之上,問題將得到解決。但我 已經在配置中設置了表名(Fluent API)。爲什麼 應該使用除Fluent API之外的註釋?

沒有問題沒有解決現在隱藏的問題。只需用SSM檢查一下,IndividualAccounts表的劑量不包含Discriminator列!

ToTable("IndividualAccounts"); 

拋出UnsupportedHybridInheritanceMapping例外,只是使所有的異常,那麼你將得到:

更多信息:

Multiple inheritance with Entity Framework TPC


我已經修改了我的班,因此現在我也可以看到鑑別器。

下次請發佈您的課程與問題。更多信息:How to create a Minimal, Complete, and Verifiable example

如果使用下面的一行代碼,這將禁用公約異常,但後來你會得到另一種problmes的:

modelBuilder.Conventions.Remove<MappingInheritedPropertiesSupportConvention>(); 

問題EF努力創造TPC而不是TPT我將與EF-Team聯繫並給您一個反饋。

+0

感謝您的回覆。關於沒有按照我的意願配置的表格,我再次檢查了它們,並確實如上所述配置了它們,即IndividualAccounts表格確實包含Discriminator列,並且整個應用程序都可以正常工作。 關於更簡單的設計,我們考慮了很多替代方案,而且這個更適合我們的要求。 – mdoust

+0

@mdoust發佈請你的類和你的DbContext和你的完整DbConfigurations,缺少一些東西。我已經創建了實體exaclty作爲你的描述,但是由於我的Discriminator列丟失了!? –