我有一种情况,我有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,纯粹用作从其继承的所有类共有的基本方法的容器。感觉我在这里缺少一些简单的东西,但我不能为我的生活看到它。
有关如何以这种方式添加基类的任何想法?或者我应该只是在代码中添加基类并以某种方式绕过模型?
编辑:作为进一步的信息,请举例说明有3种类型,MortageApplicationForm,BankAccountApplicationForm和CreditCardApplication表单。它们目前存储在3个不同的表中,具有一组不同的字段。 我正在尝试做的是创建一个类似'Form'的基类,它将包含公共字段。
在一个简单的层面上,假设每个表都有一个名为'CreditCardFormID','BankAccountFormID'等的主键ID字段。我想做的是创建一个带有'ID'属性的基础'Form'类。对于一个表的情况,将映射到'CreditCardFormID'和另一个'BankAccountFormID'。
我很高兴在部分类中执行此映射(因为我不想将'ID'持久保存到DB中)我只是想在代码中使用它,所以我可以为LoadForm之类的东西编写泛型方法( int ID)无需为每个实体类型编写大型开关,或为每个实体类型编写特定方法。
答案 0 :(得分:4)
我设法通过稍微重新调整事情来找到解决方法。首先,我没有时间来重新设计模型(我认为这是最好的解决方案)太多的系统已经用现有结构开发,以便在此时将它们分开。
到目前为止,解决方案一直是创建一个静态助手类来包含业务逻辑,这个逻辑在我的例子中是通用的,即3种不同的帐户类型。
这与'IAccount'接口相结合,允许辅助类将IAccount实例作为参数(允许传递任何特定的帐户类型。)此接口包含3-4个具体类中的所有常见属性。重要的是要注意,为了创建我可以在所有类上调用的泛型方法,我无法使用特定于该类的任何其他属性。
在辅助方法中,我需要将具体的XYZEntities实例切换为更通用的“ObjectContext”对象,然后明确地使用诸如“AddObject”之类的方法而不是“AddBankAccountForm”,“AddCreditCardForm”等。 这涉及到一小部分GetType(),以确保将对象传递给正确的ObjectSet,但似乎可以按预期工作。
答案 1 :(得分:2)
这有三种模式:
对于现有表格,每个Concrete类的表格看起来最合适。
中对这些选项有很好的描述