每个实体都继承自一个基础实体,这是一个坏主意吗?

spo*_*rts 1 inheritance entity-framework primary-key

如果我让每个类都继承自提供其密钥/ID 的基类,是否会出现问题(或者可能是一个坏主意)?这是实体框架中的代码优先设计

class MyObject
{
[Key]
public int Id { get; set; }
}

class Person : MyObject {...}
class Message : MyObject {...}
class Whatever : MyObject {...}
Run Code Online (Sandbox Code Playgroud)

我想这样做是因为经常发生这样的情况:我想要两个/三个类(例如)从某个基类继承,但我不知道那个基类负责提供 id。

具体例子,对比一下:(实际场景)

class Recipient
{
[Key]
public int RecipientId { get; set; } // I want to avoid this
public string DisplayName { get; set; }
}

class Person : Recipient {...}
class Group : Recipient {...}
Run Code Online (Sandbox Code Playgroud)

为此:(我想要实现的目标)

class MyObject
{
[Key]
public int Id { get; set; }
}

class Recipient : MyObject
{
public string DisplayName { get; set; }
}

class Person : Recipient {...}
class Group : Recipient {...}
Run Code Online (Sandbox Code Playgroud)

小智 5

我知道自从提出这个问题以来已经有一段时间了,无论如何我都会发布答案。

我已经完成了更多的代码优先项目,现在已经数不过来了,而且我总是为我的实体提供一个抽象基类。原因很简单,总有一些字段您认为应该存在于所有实体中,当然Id是最明显的。

另外,当您添加基类(或接口)时,您突然允许 DbContext 在此抽象上进行操作。我几乎总是向这个基类添加事件(例如 OnLoad、OnSave、OnDelete),然后将其保留为虚拟,然后重写DbContext 的SaveChanges方法并为受影响的实体调用适当的事件。

所以我的答案是否定的,向 EF 类添加基类没有什么坏处。但就像上面的一些答案所述,如果只是针对 Id 列,那么也许您不妨在所有课程中重复这一行(带有基本注释的 4 行;))。