我有一种情况,我有 4-5 个非常相似的类,我想重构它们以使用抽象基类。 这背后的想法是允许每个类都可以使用的方法,同时遵守 DRY 原则。
我遇到的问题是,这些类是从 EF4 生成的实体类,每次我尝试更改我的模型时,它似乎都崩溃了。
将基类添加到我的 EF 模型并使模型中的现有类继承自该基类的最佳/推荐方法是什么?目前我添加基类没问题,给它一个 ID 属性,因为它似乎需要,然后创建继承,但 EF 然后提示
“错误 3024:从第 18563 行开始的映射片段出现问题:必须为 EntitySet MyBaseType 的所有关键属性 (MyBaseType.ID) 指定映射。”
在这种情况下,我不希望将基类型持久化到数据库中,纯粹用作所有从它继承的类共有的基方法的容器。感觉好像我在这里遗漏了一些简单的东西,但我一生都看不到它。
关于如何以这种方式添加基类有什么想法吗?或者我应该只是在代码中添加基类并以某种方式绕过模型?
编辑:作为进一步的信息,举一个例子,其中有 3 种类型,MortageApplicationForm、BankAccountApplicationForm 和 CreditCardApplication 表单。它们目前存储在 3 个不同的表中,具有一组不同的字段。 我想要做的是创建一个基类,比如“表单”,其中将包含公共(public)字段。
在简单的层面上,假设每个表都有一个名为“CreditCardFormID”、“BankAccountFormID”等的主键 ID 字段我想做的是创建一个具有属性“ID”的基“Form”类对于一个表的情况,将映射到“CreditCardFormID”和另一个“BankAccountFormID”。
我很乐意在部分类中进行此映射(因为我不想将“ID”持久保存到数据库中)我只是想在代码中使用它,这样我就可以为 LoadForm( int ID)而不需要为每个实体类型编写巨大的开关,或者为每个实体类型编写特定的方法。
最佳答案
我设法通过稍微调整一些东西来解决这个问题。首先,我没有时间重新设计模型(我认为这将是最好的解决方案)系统已经用现有结构开发了太多,此时无法将其全部拆散。
到目前为止,解决方案是创建一个静态帮助程序类来包含在我的示例中通用的业务逻辑,即 3 种不同的帐户类型。
这与“IAccount”接口(interface)相结合,允许帮助类将 IAccount 实例作为参数(允许传递任何特定的帐户类型)。该接口(interface)包含 3-4 个具体类的所有公共(public)属性.重要的是要注意,为了创建我可以在所有类上调用的通用方法,我无法使用特定于该类的任何其他属性。
在辅助方法中,我需要将我的具体 XYZEntities 实例切换到更通用的“ObjectContext”对象,然后明确地使用“AddObject”而不是“AddBankAccountForm”、“AddCreditCardForm”等方法。 这涉及一点点 GetType() 以确保对象被传递到正确的 ObjectSet,但似乎按预期工作。
关于c# - Entity Framework - 不映射到数据库表的抽象基类,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8039481/