【问题标题】:Deriving from classes generated by Entity Framework in C#从 C# 中的实体框架生成的类派生
【发布时间】:2012-04-10 07:04:44
【问题描述】:

我已经创建了一个实体数据模型并从中生成了一个数据库。

其中一个实体称为Template

创建部分类来扩展Template 的功能可以正常工作。

如果我创建一个新类并尝试从 Template 派生,我会在实例化时遇到运行时异常:

Mapping and metadata information could not be found for EntityType 'Template001'.

我该如何解决这个问题?我肯定需要从 EF 类继承。

编辑

似乎不可能。如果是这种情况,实现以下要求的最佳方式是什么:模板实体存储有关模板的信息,每个模板都有自己的代码要执行。这就是为什么我首先尝试从实体派生。

【问题讨论】:

  • 查看thisthis SO 问题。
  • 当数据库中只有Template时,你想到了什么样的“自己的代码”,EF应该如何理解context.Template1s.Load()context.Template2s.Load()之间的区别?您能否举例说明您打算如何使用它?
  • @Attila:谢谢。第一个链接提到 EF 不支持我在部分类中使用的枚举,但删除它也不起作用。到目前为止,似乎除了组合之外没有其他解决方案。有什么想法吗?
  • @RaheelKhan - Sergey Sirotkin 的评论似乎是你最好的选择。
  • @hvd: context.Template1s.Load 永远不需要被调用。如果Template.ClassName == "Template1",则将调用Template1.DoWork()。所以实体本身就知道Template1Template2之间的区别。

标签: c# entity-framework class inheritance deriving


【解决方案1】:

不支持。您不能从实体派生新类型并使用它而不是映射的实体类型来进行持久性。如果您想从实体派生类,则必须使用映射继承,其中每个子项也映射到数据库。

【讨论】:

  • 我无法映射派生类,因为它们不用于持久性。它们的创建是为了根据底层实体数据实现功能。
  • 不,这样不行。如果您派生实体并使用它从数据库获取数据或将数据保存到数据库,则它用于持久性,您还必须映射派生类。如果无法映射,则表示您的继承使用不正确,您应该使用@Sergey 建议的组合。
【解决方案2】:

为什么要先继承实体类?如果要添加一些简单的行为,请使用部分类。

更新:根据 cmets,行为可能会随着时间的推移而扩展。在这种情况下,我建议使用组合/聚合,而不是继承。让需要扩展的类有一个实体作为字段。在 Raheel 的场景中,它将是一个名为 TemplateLogic 的类,其字段/属性为 Template 类型。

【讨论】:

  • 这个场景很难解释,但基本上每个派生类都会实现自定义功能,这些功能会随着时间的推移添加到代码库中。实体本身只是存储了应该使用什么样的派生类来处理。
  • 然后简单地使用组合,而不是继承。让需要扩展的类有一个实体作为它的字段。在您的场景中,您将拥有名为 TemplateLogic 的类,其字段/属性为 Template 类型。
  • 谢谢。这会使代码复杂一点,但肯定会起作用。如果我不能很快在继承中找到答案,我最终会这样做。
  • 您能否更新您的答案并将有关作文的建议放入答案文本中?目前它看起来更像是没有任何建议解决方案的评论。
  • @SergeySirotkin:谢谢。我已将您的答案标记为正确。正如 Ladislav 建议的那样,为了他人的利益,请务必更新答案文本。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多