不确定我的设置发生了什么,但最近,当我用新字段或新表更新数据库时,这些新表具有特定表(Person
)的外键,我的数据库刷新拾取新字段,但不识别到Person
的FK关系。其他表的外键可以正常工作。
可能缺少什么设置?
也许是一个线索:Person
作为其他几个表的基本类型,例如Manager
, Customer
等,它们都具有姓名,出生日期,性别等基本特征,并且后代表有一个主键,也充当Person
的外键。到后代表的FK关系也不能被识别。
实体框架在映射复杂的继承模型时可能相当有限。但是,在映射继承时,基本上有三个选项:
TPH (每个层次结构的表)映射:该映射为层次结构中的所有字段生成一个表,冲突或"同名"字段将被添加一个数字种子。例如Name1 (Person), Name2 (Manager)等
TPT (table-per-type) mapping :这个mapping为每个对象生成单独的表,但是冲突的属性名只在基类中映射。在您的实例中,Person类。注意:由于复杂的连接查询和在某些情况下遇到的异常,不建议使用TPT。
TPC (table-per-concrete-type)映射:与TPT类似,除了类的所有属性(包括继承属性)都映射到相应表的列
解决方案:
假设您正在使用TPT,这意味着您继承的类成员没有被映射。我建议您使用TPC来生成映射和迁移。您需要查看EF中的Fluent API来实现上述映射:
TPC例子:
在DbCOntext对象中声明:
protected override void OnModelCreating(ModelBuilder modelBuilder)
{
modelBuilder.Entity<Person>()
.Property(c => c.CourseID)
.HasDatabaseGeneratedOption(DatabaseGeneratedOption.None);
modelBuilder.Entity<Manager>().Map(m =>
{
m.MapInheritedProperties();
m.ToTable("Manager");
});
modelBuilder.Entity<Customer>().Map(m =>
{
m.MapInheritedProperties();
m.ToTable("Customer");
});
}
免责声明:如果没有看到继承结构或执行的迁移,很难确切地知道您的问题是什么,但是我发现EF关系中最常见的问题如上所述。
我相信我自己偶然发现了答案。除了主键外,该表在ID字段上还有一个索引。由于某种原因,所有其他表的外键指向我的表都指向索引,而不是PK…这显然把EF搞糊涂了。我删除了所有的fk,删除了索引,重新创建了fk,重新创建了索引……瞧!这些关联现在都出现在EDMX!