【问题标题】:Entity Framework - Abstract base class without mapping to DB table实体框架 - 没有映射到数据库表的抽象基类
【发布时间】:2011-11-24 16:52:17
【问题描述】:

我有 4-5 个非常相似的类,我想重新分解以使用抽象基类。 这背后的想法是允许每个类可以使用的方法,同时遵守 DRY 原则。

我遇到的问题是这些类是从 EF4 生成的实体类,每次我尝试更改我的模型时,它似乎都会崩溃。

将基类添加到我的 EF 模型中并使模型中的现有类作为基类继承的最佳/推荐方法是什么?目前我添加基类没有问题,给它一个似乎需要的 ID 属性,然后创建继承,但是 EF 然后抱怨

'Error 3024: Problem in mapping fragments starting at line 18563:Must specify mapping for all key properties (MyBaseType.ID) of the EntitySet MyBaseType.'

在这种情况下,我不希望将基本类型持久化到数据库中,纯粹用作所有继承自它的类共有的基本方法的容器。感觉好像我在这里遗漏了一些简单的东西,但我一辈子都看不到它。

关于如何以这种方式添加基类的任何想法?或者我应该只是在代码中添加基类并以某种方式绕过模型?

编辑: 作为进一步的信息,举一个例子,其中有 3 种类型,MortageApplicationForm、BankAccountApplicationForm 和 CreditCardApplication 表格。它们当前存储在 3 个不同的表中,具有一组不同的字段。 我正在尝试做的是创建一个说'Form'的基类,其中将包含公共字段。

简单来说,假设每个表都有一个名为“CreditCardFormID”、“BankAccountFormID”等的主键 ID 字段对于一个表的情况,将映射到“CreditCardFormID”和另一个“BankAccountFormID”。

我很高兴在部分类中进行此映射(因为我不想将“ID”保留到 DB)我只是想在代码中使用它,因此我可以为 LoadForm( int ID) 无需为每种实体类型编写巨大的开关,或为每种实体类型编写特定方法。

【问题讨论】:

  • table per type inheritance mapping scenario 是否适用于您的方案?
  • 可能,我会更详细地调查链接。目前,4-5 个类中的每一个都有自己的实体类型,并在我所追求的东西中定义了一个通用的基本类型。问题是它们已经映射到数据库中的不同表,而现有数据会使破坏和重新构造数据本身变得很棘手。
  • 这似乎是个坏主意,除非基础表结构更改为匹配...

标签: c# entity-framework abstract-class


【解决方案1】:

我设法通过稍微调整一下东西来解决这个问题。首先,我没有时间重新设计模型(我认为这将是最好的解决方案),太多的系统已经用现有的结构开发出来了。

到目前为止,解决方案是创建一个静态帮助程序类来包含业务逻辑,在我的示例中是通用的,即 3 种不同的帐户类型。

这与“IAccount”接口相结合,允许辅助类将 IAccount 实例作为参数(允许传递任何特定的帐户类型。)该接口包含 3-4 个具体类的所有公共属性.重要的是要注意,为了创建可以在所有类上调用的通用方法,我不能使用该类特定的任何其他属性。

在辅助方法中,我需要将具体的 XYZEntities 实例切换为更通用的“ObjectContext”对象,然后明确使用“AddObject”等方法,而不是“AddBankAccountForm”、“AddCreditCardForm”等。 这涉及到一点点 GetType()'ing 以确保将对象传递给正确的 ObjectSet,但似乎可以按预期工作。

【讨论】:

  • 我遇到了一个问题,即 EF 不喜欢该界面。抱歉,我无法添加更多详细信息。
【解决方案2】:

这有 3 种模式:

  • 每个类层次结构的表。继承层次结构中的所有具体类型都存储在一个表中。
  • 每种类型的表格。继承中的每种类型都存储在自己的表中。
  • 每个具体类的表。每个具体类都有一个表,但抽象类没有表。

在您使用现有表格的情况下,每个混凝土类的表格看起来最合适。

this book中对这些选项有很好的描述

【讨论】:

  • 是的,正如你所说,我很确定我需要使用“每个具体类的表”模式。我遇到的问题是,在将基类添加到我的模型时,它似乎需要一个 ID 字段,然后将 ID 字段映射到某些东西。在我的示例中,我只想继承一个实体类。这是由自动生成的代码产生的。我很乐意在不使用 EF 的情况下编写要继承的基类,但由于默认情况下我的具体类将从 EntityObject 继承,因此我不能强制它们从各自部分中的不同基类继承。
猜你喜欢
  • 1970-01-01
  • 2012-10-20
  • 2010-10-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-08-31
  • 2014-12-13
相关资源
最近更新 更多