.net - Entity Framework 5 : Table-per-Type mapping with concrete base class

标签 .net entity-framework inheritance ef-code-first table-per-type

我正在开发一个 EF5 Code First 应用程序,到目前为止一切进展顺利,但我遇到了一个障碍,我希望有人能提出解决方案。

基本上,我有一个基类和一些派生类,我想知道如何处理它们的映射。这是一个可笑的简化示例:

[Table("Person")]
public class Person
{
  public int PersonId { get; set; }
  public string Name { get; set; }
}

[Table("EmployeePerson")]
public class EmployeePerson : Person
{
  public int HoursWorked { get; set; }
}

[Table("CustomerPerson")]
public class CustomerPerson : Person
{
  public int DollarsSpent { get; set; }
}

到目前为止,这是一个典型的 Table-per-Type 场景,除了基类不是抽象的问题——可能有 Person谁不是EmployeePersonCustomerPerson .我在让 EF 接受它时遇到了一些麻烦,当我尝试通过 ID 加载这样的实体时,EF 生成的丑陋查询不返回任何行。

有没有人以前实现过这样的东西? TPT 风格的映射是否总是要求基类是抽象的?我无法找到任何相反的例子,但也没有真正的确认。如果需要,我可以想到一些丑陋的解决方法,但如果有的话,我更喜欢更优雅的解决方案。

(还有一个问题:我正在使用第三方数据库,因此我无法对架构进行任何更改。)

谢谢!

最佳答案

如果您的“丑陋”解决方案是引入抽象基类 PersonBase (或类似)并制作 Person一个空的派生类,我的评论是:做吧!它一点也不难看,因为它留有改变的空间 Person以后不会影响其他派生类。目前,这将困难得多。稍后您必须引入抽象类,这是对现有代码的更大更改。

关于您的问题:我无法使用 EF 5(VS 2012 .Net 4.5)重现该问题。也许在你的真实模型中还有更多的事情发生。

关于.net - Entity Framework 5 : Table-per-Type mapping with concrete base class,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15956168/

相关文章:

.net - 多线程写入,从队列中读取一个线程,线程安全

c# - 在 C# 中访问简单的 bool 标志时,是否需要锁定或标记为 volatile ?

.net - 如何使用 clickonce 应用程序部署文件?

c# - OrderByDescending with Skip and Take 在 LINQ 中显示错误

c# - 如何使用存储库模式(或更合适的东西)来实现这个?

java - 扩展对象隐式

inheritance - 时间:2019-03-14 标签:c++/clisintaxis: Error: 'new' or 'override' is required because this declaration matches function

c# - 无法在 .net core 2.1 中读取用户 secret

c++ - 如何确保派生类实现特定方法,保留标准布局?

c# - 此 LINQ JOIN 是否存在某种语法错误?