在多个edmx文件(Entity Framework 4.0)之间共享模型

5

我正在寻找解决办法,这是一个我和其他人可能都会面临的问题。

目前,我正在开发一个包含近400个表的应用程序。该应用程序由七个类库项目(StudentInfo、library、Fees等)组成,每个项目都有自己的.edmx文件(包含50个表),代码生成策略为默认设置;并且有一个单独的Web应用程序项目引用了这些类库项目。
其中大约有15个常见的表格,将出现在每个类库项目的.edmx文件中。所有.edmx文件的类/模型命名空间相同(Campus)。

我创建了一个名为School的部分类,其中包含一些方法。

然而,下列编译时错误会被抛出: 类型“Campus.School”存在于“D:\Project\Campus\CampusStudent\”和“D:\Project\Campus\CampusLibrary\bin\Debug\CampusLibrary.dll”中。

其他成员提出的解决方案如下:
1)为每个.edmx文件使用不同的命名空间。
2)为模型分别命名,例如:StudentSchool、LibrarySchool等。
这些解决方案将迫使我在每个类库项目中复制具有其方法的公共类。

请问是否有人能帮我解决问题?


我猜问题是你是否真的需要所有edmx文件中存在的那15个表。你不能逻辑上分割模型以消除冗余吗? - Luc Morin
1个回答

6
如果您正在使用POCO T4模板进行当前实体生成,那么就有一种方法。在EF中,POCO可以是任何命名空间中的任何类,其名称与EDMX中的实体相同,并且具有与EDMX中实体相同的所有属性名称(包括getter和setter的相同类型和可访问性)。
在另一个程序集中定义您的15个共享类(必须遵循上述POCO规则),并通过所有库项目引用它。一旦您拥有此程序集,请创建自己的版本的POCO T4模板,该模板将不会为这些共享实体创建新的类文件,而是使用来自引用程序集的类。
另一种选择是手动创建和维护所有这400个类和EF上下文类型。如果您使用仅代码映射(也称为代码优先),则将执行此操作,并且您将不会遇到这些问题。

谢谢您的回复。我会尝试实现它。 - Ravi Shet
亲爱的Ladislav,您是否有示例应用程序或资源链接可以帮助我实现它。实际上,我无法将您的建议应用于创建POCO T4模板,该模板不会为这些共享实体创建新的类文件,而是使用来自引用程序集的类,因为我对EF不是很熟练。 - Ravi Shet
对不起,我没有例子。您只需要创建一个静态的硬编码实体名称集合,这些实体名称不应该被创建。该集合将直接在模板中定义。在生成实体代码的模板部分中,验证实体名称未出现在集合中。您还需要修改其他实体中生成导航属性的代码,以使用来自引用程序集的正确类型。 - Ladislav Mrnka
亲爱的Ladislav,我已经决定将所有Classlibrary项目合并为一个,并使用各自Classlibraries的多个edmx文件。我使用了ADO.Net POCO实体生成器并编辑了模板,这将防止公共实体的属性被生成到其他.edmx上下文中。我将所有类库合并为单个类库的主要原因是部分类不能跨越程序集。无论如何,感谢您的帮助。 - Ravi Shet
如果您想要共享类,当然不能通过其他程序集的部分部分定义它们的附加部分。必须在共享程序集中定义所有属性和方法的整个类。 - Ladislav Mrnka

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