提问人:Deepan Maheswaran 提问时间:10/17/2023 最后编辑:Deepan Maheswaran 更新时间:10/17/2023 访问量:53
如何在不中断/更改继承策略或行为的情况下将现有实体从 EF 6.1 升级到 EF Core 7?
How do I upgrade the existing entities from EF 6.1 to EF Core 7 without breaking/changing the inheritance strategy or behavior?
问:
我在 .NET Framework 上构建了一个现有的 ASP.NET MVC Web 应用程序,该应用程序使用具有代码优先方法的 Entity Framework 6.1 和 SQL Server。
下面显示的实体使用“每个类型一个表”和“每个层次结构一个表”继承策略,这在 Entity Framework 6.1 中没有任何问题。
public abstract class Animal
{
public string Name { get; set; }
public int Age { get; set; }
public abstract void MakeSound();
}
public abstract class Mammal : Animal
{
public string FurColor { get; set; }
public abstract void GiveBirth();
}
public class Dog : Mammal
{
public override void MakeSound()
{
Console.WriteLine("Woof! Woof!");
}
public override void GiveBirth()
{
Console.WriteLine("Dog gives birth to puppies.");
}
}
public class Cat : Mammal
{
public override void MakeSound()
{
Console.WriteLine("Meow! Meow!");
}
public override void GiveBirth()
{
Console.WriteLine("Cat gives birth to kittens.");
}
}
下面是 Fluent API 配置
modelBuilder.Entity<Animal>().ToTable("Animal");
modelBuilder.Entity<Mammal>().ToTable("Mammal")
.HasDiscriminator<string>("Discriminator")
.HasValue<Dog>("Dog")
.HasValue<Cat>("Cat");
modelBuilder.Entity<Dog>().ToTable("Mammal");
modelBuilder.Entity<Cat>().ToTable("Mammal");
通过上述配置,Entity Framework 6.1 创建了两个表,并在表中包含一个鉴别器。Animal
Mammal
Mammal
问题
但是,当我尝试使用 EF Core 7 重新创建相同的内容时,它失败并出现以下错误:
System.InvalidOperationException:“无法实例化实体类型”Animal“的相应 CLR 类型,但使用”TPC“映射策略将实体类型映射到”Animal”。只应映射可实例化类型。
我知道 EF Core 7.0 中引入了 table-per-concrete-type。但是,它们是否仍支持与 Entity Framework 6.1 相同的实现?
我尝试过:在对 Microsoft 关于 EF Core 继承的文档进行了一些研究之后。我尝试了以下配置,但它们不起作用。
- 配置要使用的实体
Animal
modelBuilder.Entity<Animal>().ToTable("Animal").UseTpcMappingStrategy();
- 配置要使用的实体
Mammal
HasDiscriminator<string>("MammalType")
问题
如何在不中断/更改继承策略或行为的情况下将上述实体从 EF 6.1 移植/迁移到 EF Core 7?
答: 暂无答案
评论
Dog
Cat
Mammal
Animal
UseTptMappingStrategy
The mapping strategy 'TPT' specified on 'Animal' is not supported for entity types with a discriminator