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

13

我的情况是有4-5个非常相似的类,我想重构它们,使用抽象基类。这样做的想法是允许每个类都可以使用的方法,同时遵循DRY原则。

我的问题是这些类是由EF4生成的实体类,每次尝试修改模型时,看起来都会崩溃。

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

'错误3024:映射片段起始处存在问题,从第18563行开始:必须指定所有键属性(MyBaseType.ID)的映射,以便EntitySet MyBaseType.'

在这种情况下,我不希望基本类型持久化到数据库中,纯粹用作包含所有继承它的类共同基础方法的容器。感觉我错过了一些简单的东西,但我无论如何都看不到它。

有什么想法以这种方式添加一个基类吗?还是我应该在代码中添加基类并绕过模型?

编辑: 更进一步的信息,例如现在有3种类型,MortageApplicationForm、BankAccountApplicationForm和CreditCardApplicationform。它们当前存储在3个不同的表中,具有一组不同的字段。

我正在尝试做的是创建一个名为“Form”的基类,其中将拥有共同的字段。

简单地说,假设每个表都有一个名为“CreditCardFormID”、“BankAccountFormID”等的主键ID字段。 我想做的是创建一个基本的“Form”类,其中包含一个属性“ID”,对于某个表的情况将映射到“CreditCardFormID”,而另一个则映射到“BankAccountFormID”。

我很高兴在部分类中进行这种映射(因为我不想将“ID”持久化到数据库中),我只是想在代码中使用它,以便我可以编写通用方法,例如LoadForm(int ID),而无需为每个实体类型编写大量的开关语句或特定的方法。


一个table per type继承映射场景能适用于你的场景吗? - chris
可能我会更详细地调查这个链接。目前,4-5个类都是自己的实体类型,并且定义一个通用的基础类型是我想要的。问题在于它们已经映射到数据库中的不同表格,并且现有数据将使销毁和重构数据本身变得棘手。 - dougajmcdonald
除非更改底层表结构,否则这似乎是一个不好的想法... - nathan gonzalez
2个回答

4
我成功地通过略微调整事情的方式找到了一个解决方法。首先,我没有时间重新设计模型(我认为这将是最好的解决方案),因为系统中已经使用现有结构开发了太多的东西,所以无法在此时将其全部拆开。
目前的解决方案是创建一个静态的辅助类来包含业务逻辑,在我的示例中是三种不同的帐户类型的通用业务逻辑。
这与“IAccount”接口配对使用,允许辅助类将IAccount实例作为参数(允许传递任何特定的帐户类型)。该接口包含3-4个具体类中所有共同属性。需要注意的是,为了创建可调用所有类的通用方法,我不能使用任何特定于类的其他属性。
在辅助方法中,我需要将具体的XYZEntities实例切换为更通用的“ObjectContext”对象,然后使用诸如“AddObject”而不是显式的“AddBankAccountForm”,“AddCreditCardForm”等方法。这涉及到一点GetType()操作,以确保将对象传递到正确的ObjectSet中,但似乎可以按预期工作。

我遇到了一个问题,EF不喜欢这个接口。很抱歉我不能提供更多细节。 - Jess

2

这有3种模式:

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

根据现有表格,具体类表格看起来是最合适的选择。

这些选项在这本书中有很好的描述。


是的,正如你所说,我很确定我需要使用“具体类每个表”模式。我的问题是,在将基类添加到我的模型时,它似乎要求一个ID字段,然后将该ID字段映射到某些内容。在我的示例中,我只想从一个实体类继承。这是由自动生成的代码生成的。我很乐意编写一个不使用EF的基类来继承,但由于我的具体类默认将继承自EntityObject,因此我无法强制它们在各自的部分中继承自一个不同的基类。 - dougajmcdonald

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接