2017-06-23 29 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是一个很好的解释它的文章。

设计数据库表的一个有趣的方法,我以前没有遇到过。我生活和学习:)