EF DB 首次刷新未检测到特定 table 的 FK
EF DB First refresh is not detecting FKs to a particular table
不确定我的设置发生了什么,但是最近,当我用新字段或新 tables 更新我的数据库时,这些字段或新 tables 具有特定 table 的外键(Person
),我的数据库刷新选择了新字段,但不识别与 Person
的 FK 关系。大多数其他 table 的外键工作正常。
可能缺少什么设置?
也许是一条线索:Person
充当其他几个 table 的基本类型,例如Manager
、Customer
等都具有姓名、出生日期、性别等基本特征,后代table有一个主键,也作为外键Person
。与后代 table 的 FK 关系也未被识别。
Entity Framework 在映射复杂的继承模型时可能会受到限制。但是,在映射继承时基本上有三个选项:
TPH (每个层级table)映射:此映射为您的所有对象生成单个 table层次结构中的字段和冲突或 "same-name" 字段将附加一个数字种子。例如姓名1(人)、姓名2(经理)等
TPT (table-per-type) 映射:此映射生成单独的 tables每个对象,但是有冲突的 属性 名称仅映射到基础 class 中。在您的实例中,Person class。注意:由于复杂的连接查询以及在某些情况下您遇到的异常情况,不鼓励使用 TPT
TPC (table-per-concrete-type) mapping:类似于TPT,除了a class,包括继承的属性,映射到对应的table
的列
解法:
假定您正在使用 TPT,这意味着您继承的 class 成员未被映射。我建议您查看 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 关系中最常见的问题。
我相信我自己偶然发现了答案。
除了主键之外,table 在 ID 字段上还有一个索引。出于某种原因,所有其他具有我的 table 外键的 table 都指的是索引而不是 PK...这显然混淆了 EF。
我删除了所有 FK,删除了索引,重新创建了 FK,并重新创建了索引……瞧!现在所有的关联都出现在EDMX中了!
不确定我的设置发生了什么,但是最近,当我用新字段或新 tables 更新我的数据库时,这些字段或新 tables 具有特定 table 的外键(Person
),我的数据库刷新选择了新字段,但不识别与 Person
的 FK 关系。大多数其他 table 的外键工作正常。
可能缺少什么设置?
也许是一条线索:Person
充当其他几个 table 的基本类型,例如Manager
、Customer
等都具有姓名、出生日期、性别等基本特征,后代table有一个主键,也作为外键Person
。与后代 table 的 FK 关系也未被识别。
Entity Framework 在映射复杂的继承模型时可能会受到限制。但是,在映射继承时基本上有三个选项:
TPH (每个层级table)映射:此映射为您的所有对象生成单个 table层次结构中的字段和冲突或 "same-name" 字段将附加一个数字种子。例如姓名1(人)、姓名2(经理)等
TPT (table-per-type) 映射:此映射生成单独的 tables每个对象,但是有冲突的 属性 名称仅映射到基础 class 中。在您的实例中,Person class。注意:由于复杂的连接查询以及在某些情况下您遇到的异常情况,不鼓励使用 TPT
TPC (table-per-concrete-type) mapping:类似于TPT,除了a class,包括继承的属性,映射到对应的table
的列解法:
假定您正在使用 TPT,这意味着您继承的 class 成员未被映射。我建议您查看 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 关系中最常见的问题。
我相信我自己偶然发现了答案。 除了主键之外,table 在 ID 字段上还有一个索引。出于某种原因,所有其他具有我的 table 外键的 table 都指的是索引而不是 PK...这显然混淆了 EF。 我删除了所有 FK,删除了索引,重新创建了 FK,并重新创建了索引……瞧!现在所有的关联都出现在EDMX中了!