我有一种情况,我有4-5个非常相似的类,我想重新考虑使用抽象基类。这背后的想法将是允许方法,可以使用的每一个类别,同时坚持干燥的原则。
我遇到的问题是,这些类是从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,因为它纯粹用作所有继承它的类所共有的基本方法的容器。感觉好像我错过了一些简单的东西,但我不能在我的生活中看到它。
对于如何以这种方式添加基类,有什么想法吗?或者,我应该只是在代码中添加基类,并以某种方式绕过模型?
编辑:作为进一步的信息,举一个例子,其中有3种类型,MortageApplicationForm、BankAccountApplicationForm和CreditCardApplication表单。它们目前存储在3个不同的表中,其中包含一组不同的字段。我想要做的是创建一个基类,例如“Form”,其中包含公共字段。
简单地说,假设每个表都有一个主键ID字段,名为'CreditCardFormID‘、'BankAccountFormID’等等--我想要这样做--创建一个带有属性'ID‘的基类,对于一个表,这个类将映射到'CreditCardFormID’和另一个'BankAccountFormID‘。
我很乐意在部分类中完成这个映射(因为我不想将'ID‘保存到DB中)--我只是想在代码中使用它,这样我就可以为诸如LoadForm(int )这样的事情编写通用方法,而无需为每种实体类型编写巨大的开关,或者为每个实体类型编写特定的方法。
发布于 2011-11-24 08:52:17
我通过稍微调整一些东西,设法找到了这方面的工作。首先,我没有时间重新设计这个模式(我认为这是最好的解决方案),太多的系统已经用现有的结构开发出来,无法在这一点上把它全部拆散。
到目前为止,解决方案是创建一个静态助手类,以包含业务逻辑,这在我的示例中是通用的,在我的示例中是3种不同的帐户类型。
这与一个' IAccount‘接口结合在一起,允许助手类将一个IAccount实例作为参数(允许传递任何特定的帐户类型)。这个接口包含了3-4个具体类中的所有公共属性。需要注意的是,为了创建泛型方法(我可以调用所有类),我无法使用该类特有的任何其他属性。
在helper方法中,我需要将具体的XYZEntities实例转换为一个更通用的'ObjectContext‘对象,然后使用诸如'AddObject’等方法,而不是'AddBankAccountForm‘、'AddCreditCardForm’等方法。这涉及到少量的GetType()'ing,以确保将对象传递给正确的ObjectSet,但似乎可以按需要工作。
发布于 2011-11-07 20:19:10
这方面有三种模式:
在您的例子中,对于现有的表,每个具体类的表看起来是最合适的。
在这本书中对这些选项有很好的描述。
https://stackoverflow.com/questions/8039481
复制相似问题