EF中POCO对象的继承?

时间:2012-01-25 23:04:18

标签: entity-framework poco

我正在尝试使用EF,代码优先和pocos来解决以下问题:

假设我有一个必须为不同客户服务的应用程序。每个客户都有自己的数据库和模型,因此我将为每个客户创建一个模型和一个存储库项目。

问题是 - 我应该在哪里将业务代码放在所有安装中?在传统的OOP中,我将有一个类库,其中包含一组定义基本行为的基类 - 例如UserBase,ArticleBase,常量,实用方法等。然后在客户特定项目中,我将从该基类继承一个类并扩展其数据和行为,例如Client1User:User或Client1Article:ArticleBase。

我的第一个想法是使用edmx文件定义基类及其关系的公共类库。使用tt模板,我生成了POCO类,并可选择添加了一些自定义代码。 在我为每个客户端创建的自定义库中,我引用了基本库,并创建了从公共库或全新类继承的特定类。在自定义库中,我还创建了客户特定的edmx并使用t4模板生成POCO。 我还创建了单独的存储库项目来处理持久性和查询。 在存储库类中,我有一堆我应该能够查询的DbSet ClassnameSet属性。

问题是我无法做到这一点而且我不断碰到Metadataexception - A类不是当前模型的一部分或

  

指定的架构无效。错误:关系'xxx'不是   因为类型'model.User'不可用而加载。下列   信息可能有助于解决先前的错误:基数   输入'ClientLibrary.Model.User'类型的'BaseLibrary.BaseUser'   与模型基本类型'model.User'不匹配。

感谢您解决这个谜团的任何帮助。或者让我指向不同的方向来实现我的目标。

Tvrtko

1 个答案:

答案 0 :(得分:0)

我首先考虑一下你的“架构”。为每个客户提供单独的模型和“存储库”是过度的。 Use single data access layer并使您的应用程序可配置和可扩展,以支持所有客户的需求。

此方案的问题是基本库和客户端库之间的类型继承。首先,您将无法在基础库中使用EDMX - 您必须在每个客户端库中创建新的。如果要在映射中使用客户端特定类型或基本类型,则还必须做出决定。使用基类型意味着为每个实体使用继承映射。使用客户端类型可能会导致您出现当前异常 - 您的基类型可能定义了指向其他基类型的导航属性 - 如果您不在客户端库中映射基类型,则这是不可能的。