我正在使用MVC3 Web应用程序中的Entity Framework 4.1。我的任务是使用数据库重新编写遗留应用程序,该数据库具有大约200多个表,已经存在数据,因此采用数据库第一种方法与EF。
我理解为整个应用程序创建一个巨大的edmx模型是不好的做法,但经过几个小时的研究,我无法明确指出如何前进,因为我无法弄清楚如何重新开始在多个模型中使用公共表。但是我想将我的模型分解成更小,可管理的环境。
当我将公共表(例如Users)放在两个模型中时,项目会以以下形式抛出编译错误:
“Project.Models.EntityX”类型已包含“EntityX_PropertyY”的定义
我找到的最接近解决方法的地方是:http://connect.microsoft.com/VisualStudio/feedback/details/366721/entity-framework-the-type-xxx-already-contains-a-definition-for-x
Microsoft于2008年9月17日下午5:18发布
这个问题是设计的。解决方法是将模型放在不同的文件夹中(对于C#和ASP.NET项目),或者设置自定义工具命名空间(对于C#和VB项目)。
这是在08年。我无法选择工作,我想知道是否有更好的方法来构建项目,以便我能够在多个模型中使用相同的表?
答案 0 :(得分:3)
我们的团队为我们的项目完成了所有这些帖子(约600个表)。我在这里回答的一个重要警告是,我们尚未完成项目,所以并非所有学习都已完成。我只能提供迄今为止所学到的知识。
基本上,你想做的事情不可能以现实的方式进行(目前,我知道)。
我们的要求是能够使用可视化设计器(不一定是Visual Studio设计器),并且不必在一堆自动生成的文件中(或创建自动破解文件的工具),因为那是只是在很多方面的灾难处方。
我们最终得到了两个可能的解决方案,并指出我们真正想要的是表的逻辑分组:
在LLBLGen中使用设计器(注意:不能免费用于商业用途),可以在逻辑上将表分成数据库的不同“视图”
将表分成基于业务的子集(即销售,报表等),重叠表重复使用不同的名称,每个列可能有不同的列集子域
在我们的测试阶段,我们非常喜欢LLBLGen的设计师;然而,代码生成选项令人眼花缭乱(绝对由程序员为程序员编写)并且输出还有很多不足之处(在我第一次尝试时,它生成了无法编译的代码)。如果你愿意花一些钱进入你的项目并花一些时间测试一下,我仍然建议你自己试试(有一个免费试用版);正如我所说,设计师非常好,在互联网上阅读,似乎有很多成功的故事。
毋庸置疑,我们选择了后一种解决方案。这对我们有用,因为在我们的业务模型中,当我们有一个“共享”表时,在除了一个子域模型之外的所有子表模型中,该表是只读的,我们不担心在所有子域模型之间传播更改(即,我们只需要来自每个子域的数据的某种视图)。这可能与您的情况不同。如果您开始对底层架构进行大幅度更改,则会产生额外的维护开销,但由于您正在使用旧版数据库,因此情况可能并非如此。我们决定权衡它以保持工具在我们现有的开发环境中。 (注意:我们正在使用一个经过轻微修改的POCO文本模板来自己生成实体类。如果没有别的,这部分是一个非常好的决定。)
只有大约200张桌子,我会说尝试将它们全部放入一个模型中,即使只是作为一个实验。你肯定想要使用你最强大的开发盒......当我们使用我们的模型(EF 4.0)尝试这个时,我们不得不在进程中杀死它。
在我们的阅读过程中,我们确实看到了一些关于直接在Visual Studio设计器中支持模型“视图”的声音。如果存在,我们绝对会使用它。但事实上,我怀疑这种功能是在后面。与100桌或更少桌面的项目相比,200桌项目绝对是利基,这些项目并不真正需要这样的功能。
答案 1 :(得分:1)
一个简单的解决方案就是更改模型中的实体名称 您可以将上下文添加为实体名称的前缀,它可以解决您的问题。
答案 2 :(得分:0)
如果你还在努力尝试,只要把它扔到那里,但你是否尝试将模型放入不同的装配体中?
例如:MyProject.Data.Sales中模型中的所有订单表 MyProject.Data.Customers中模型中的所有客户管理 等
由于它们位于不同的名称空间中,因此它们不会以这种方式发生冲突,您应该可以根据需要拥有尽可能多的名称空间。当你想使用它时,你只需要正确引用它们。