2017-06-23 52 views
1

我開始在帶有SQLite的UWP應用程序中使用EFCore。我宣佈了我想要存儲在數據庫中的類。然後我宣佈各種DbSets和OnConfiguring覆蓋:EFCore/UWP在添加遷移時缺少一些表格

public class DatabaseContext : DbContext 
{ 
    public DbSet<Person> People { get; set; } 
    public DbSet<Relationship> Relationships { get; set; } 
    public DbSet<SourceDescription> SourceDescriptions { get; set; } 
    public DbSet<Agent> Agents { get; set; } 
    public DbSet<Event> Events { get; set; } 
    public DbSet<Document> Documents { get; set; } 
    public DbSet<PlaceDescription> PlaceDescriptions { get; set; } 

    protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder) 
    { 
     optionsBuilder.UseSqlite("Filename=Testing.db"); 
    } 
} 

在Package Manager控制檯,然後我去:

Add-Migration 2017-06-23 

,它創造的代碼,然後建立數據庫。但是,該代碼缺少一些頂級表。他們中的一些人在那裏,但有些人沒有,我不能看/找出是什麼原因造成的。沒有錯誤產生,我無法找到一個模式,以確定爲什麼丟失的表丟失。

更多信息:

  • 有我的代碼中定義的29類。遷移代碼創建24個表。

  • 在5個「缺失」類中,其中4個來源於Subject,而這個Subject來自結論。第五個是結論類。由於遷移代碼將每個派生類的屬性「合併」,因此我並不感到驚訝的是,結論類沒有自己的表,因爲沒有直接使用它作爲類。

  • 除了結論類以外,其他4個類只在DbSet屬性中引用(而不是在其他類的屬性中使用)。如上所述,Document類是從另一個類派生的,所以它不是派生類是共同的因素。

  • 這並不是說某些類是部分類。

  • 我無法找到任何有關類屬性的常見因素。例如,Person類有List幾次,但Agent類也是這樣,並且確實出現在遷移代碼中。

關於我能找什麼或者如果這是一個已知問題的任何建議?

+0

做一些類繼承其他? –

+0

@IvanStoev是的,但恐怕不是答案。我已經添加了更多信息來顯示某些派生類確實出現在遷移代碼中。 –

+1

問題是,如果某些基類是通過'DbSet'公開的,或者是從某個實體的導航屬性引用的,或者被用作'modelBuilder.Entity'調用的通用參數(而不是簡單的實現繼承),EF將會認爲它是一個實體,並將使用TPH策略(即創建帶有鑑別器的單個表)。例如,4個缺失的類可能已被合併到一個「Subject」表中。使用Discriminator列檢查表格的遷移。 –

回答

1

爲了澄清,Ivan提供的答案是,EF Core將會看到從Subject類派生出來的四個類,併爲Subject類構建一個包含這些派生類的所有屬性的表。然後在Subject類中添加一個Discriminator列,指出哪個派生類適用於此類。

http://www.learnentityframeworkcore.com/inheritance/table-per-hierarchy是一個很好的解釋它的文章。

設計數據庫表的一個有趣的方法,我以前沒有遇到過。我生活和學習:)