实体框架——没有映射到数据库表的抽象基类

本文关键字:抽象 数据库 基类 映射 框架 实体 | 更新日期: 2023-09-27 18:13:49

我有一个情况,我有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.'

在这种情况下,我不希望基类型被持久化到DB,纯粹用作继承它的所有类共同的基方法的容器。我觉得我错过了一些简单的东西,但我怎么也看不出来。

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

EDIT:作为进一步的信息,举一个例子,其中有3种类型,MortageApplicationForm, BankAccountApplicationForm和CreditCardApplication form。它们目前存储在3个不同的表中,具有一组不同的字段。我要做的是创建一个基类,比如Form,它会有公共字段。

在一个简单的层面上,说每个表有一个主键ID字段,'CreditCardFormID', 'BankAccountFormID'等。我想做的是创建一个带有属性'ID'的基本'Form'类,对于一个表将映射到'CreditCardFormID'和另一个'BankAccountFormID'。

我很高兴在部分类中做这种映射(因为我不想将'ID'持久化到DB),我只是想在代码中使用它,所以我可以为LoadForm(int ID)等东西编写通用方法,而无需为每个实体类型编写巨大的开关,或者为每个实体类型编写特定的方法。

实体框架——没有映射到数据库表的抽象基类

我设法通过稍微调整东西来找到解决这个问题的方法。首先,我没有足够的时间来重做模型(我认为这是最好的解决方案),太多的系统已经用现有的结构开发出来了,在这一点上把它全部拆开了。

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

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

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

有3种模式:

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

在现有表的情况下,每个具体类的表看起来是最合适的。

这本书对这些选项有很好的描述