gpt4 book ai didi

c# - EntityFramework 5 Code First 多重继承映射 (TPC)

转载 作者:太空狗 更新时间:2023-10-29 19:45:36 27 4
gpt4 key购买 nike

好吧,可能这个问题之前已经回答过,但我一直在研究,但我找不到解决我的具体问题的方法

Code of this sample - Visual Studio 2012 - Console App

所以我有一个带有多个继承对象的 EntityFramework Code First 模型。我创建了这个代表我的问题的例子:

型号

public abstract class Person
{
[Key]
public Guid PersonId { get; set; }
public string FirstName { get; set; }
public string LastName { get; set; }
}

public class Employee : Person
{
public decimal BaseSalary { get; set; }
}

public class ExecutiveEmployee : Employee
{
public string Title { get; set; }
}

上下文

public class MyContext : DbContext
{
public DbSet<Employee> Employees { get; set; }
public DbSet<ExecutiveEmployee> ExecutiveEmployees { get; set; }

protected override void OnModelCreating(DbModelBuilder modelBuilder)
{
modelBuilder.Entity<Employee>().Map(x =>
{
x.MapInheritedProperties();
x.ToTable("Employees");
});

modelBuilder.Entity<ExecutiveEmployee>().Map(x =>
{
x.MapInheritedProperties();
x.ToTable("ExecutiveEmployees");
});
}
}

我想使用 TPC (Table Per Concrete Type) mapping

运行迁移并更新我的数据库后,结果如下:

enter image description here

这是我的期望。到目前为止一切顺利。

但是...... 我决定向我的 Person 类添加一个 Gender 对象和一个属性,如下所示:(这不是我的真实模型,它只是一个例子)

public class Gender
{
[Key]
public Guid GenderId { get; set; }

[Required]
[MaxLength(250)]
public string Name { get; set; }
}

public abstract class Person
{
....
public Gender Gender { get; set; }
....
}

public class MyContext : DbContext
{
....
public DbSet<Gender> Genders { get; set; }
....
}

应用迁移并更新数据库后,这是数据库模型:

enter image description here

为什么YYYYYYY?

我错过了什么?我只希望 EF 在我的继承层次结构中映射我的 reference 属性。我期望 ExecutiveEmployees 表包含一个指向 Genders 的外键,与 EmployeesGenders

我在我的 MyContext.OnModelCreating 上试过这个:

modelBuilder.Entity<ExecutiveEmployee>().Map(x =>
{
x.MapInheritedProperties();
x.Properties(c => c.Gender);// <<-- does not work
x.ToTable("ExecutiveEmployees");
});

但是当我尝试添加迁移时,我收到此错误:

The property 'Gender' on type 'ExecutiveEmployee' cannot be mapped because it has been explicitly excluded from the model or it is of a type not supported by the DbModelBuilderVersion being used.

最佳答案

这很奇怪,我将您的示例运行到 visual studio 中并使用 EF Power Tools 查看 EDMX 生成器如何可视化这些关系,这就是我得到的: Entity Data Model
从这张图中我可以看出为什么会出错,因为现在 Entity Framework 假设导航属性已经在父类中找到。现在至于如何,我认为这是一个关于 TPC 的 Code First 中的多级继承的错误,应该被修复。

关于c# - EntityFramework 5 Code First 多重继承映射 (TPC),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15440485/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com