如何在多个模型中使用相同的表

本文关键字:模型 | 更新日期: 2023-09-27 18:02:30

我在一个mvc Web应用程序中使用实体框架4.1。我的任务是用数据库重写一个遗留应用程序,其中包含大约200多个表,已经有数据,因此对EF采用数据库优先的方法。

我知道为整个应用程序创建一个巨大的edmx模型是不好的做法,但是经过几个小时的研究,我无法得到如何前进的明确方向,因为我不知道如何在多个模型中重用通用表。但是我想把我的模型分解成更小的、可管理的上下文。

当我将一个公共表(比如Users)放在两个模型中时,项目抛出一个编译错误,其形式为:

项目。模型。EntityX'已经包含了'EntityX_PropertyY'的定义

我找到的最接近的解决方法是:http://connect.microsoft.com/VisualStudio/feedback/details/366721/entity-framework-the-type-xxx-already-contains-a-definition-for-x

由微软发布于9/17/2008 at 5:18 PM

这个问题是设计出来的。解决方法是将模型放在不同的文件夹中(对于c# &ASP。. NET项目),或者设置自定义工具命名空间(对于c# &VB项目)。

这是在08年。我无法得到任何一个选择的工作,我想知道是否有一个更好的方法去构建项目,使我能够在多个模型中使用相同的表?

如何在多个模型中使用相同的表

我们的团队为我们的项目(约600个表)浏览了所有这些帖子。对于我的回答,有一个很大的警告是,我们还没有完成这个项目,所以并不是所有的学习都发生了。我只能提供我们目前了解到的情况。

从本质上讲,你想做的事情在现实中是不可能的(目前,据我所知)。

我们的要求是能够使用可视化设计器(不一定是visual Studio设计器),并且不需要在一堆自动生成的文件中进行修改(或创建工具来自动修改文件),因为这在很多方面都是一种灾难。

我们最终得到了两种可能的解决方案,注意到我们真正想要的是表的逻辑分组:

  • 使用LLBLGen中的设计器(注意:不是免费的商业用途),可以逻辑上将表分离到数据库的不同"视图"

  • 将表划分为基于业务的子集(即销售、报告等),重叠的表使用不同的名称重复,并且可能在每个子域

  • 中使用不同的列集

在我们的测试阶段,我们真的很喜欢LLBLGen的设计师;然而,代码生成选项令人眼花缭乱(肯定是程序员为程序员编写的),并且输出留下了很多不理想的地方(在我第一次尝试时,它生成的代码无法编译)。如果你愿意为你的项目投入一些资金并花一些时间进行测试,我仍然会建议你自己尝试一下(游戏邦注:有一个免费的试用版);就像我说的,这个设计师很好,在网上阅读,似乎有很多成功的故事。

不用说,我们选择了后者。这对我们来说很有效,因为在我们的业务模型中,当我们有一个"共享"表时,除了一个子域模型外,这个表在所有子域模型中都是只读的,我们不担心在所有子域模型之间传播更改(也就是说,我们只需要来自每个子域的数据的特定视图)。这对你来说可能不一样。如果您开始对底层模式进行重大更改,则会产生额外的维护开销,但由于您使用的是遗留数据库,因此可能不会出现这种情况。我们认为在现有的开发环境中保留工具是值得的。(注意:我们使用一个稍微修改过的POCO文本模板来生成实体类本身。如果没有别的,这部分确实是一个很好的决定。

在只有200张表的情况下,我会说尝试将它们全部放入一个模型中,即使只是作为一个实验。你肯定会想要使用你最强大的开发盒来完成这个…当我们尝试使用我们的模型(EF 4.0)时,我们不得不在进程中终止它。

在阅读过程中,我们确实看到了一些关于在Visual Studio设计器中直接支持模型"视图"的传言。如果它存在,我们肯定会使用它。尽管如此,我怀疑这种功能已经被搁置了。与100表或更少表的项目相比,200表的项目绝对是小众的,后者不需要这样的特性。

一个简单的解决方案就是更改模型中的实体名称。
您可以将上下文作为实体名称的前缀添加,这将解决您的问题。

只是抛出这个,如果你还在尝试的东西,但你试过把模型到不同的程序集吗?

MyProject.Data.Sales中一个模型中的所有订单表在MyProject.Data.Customers中的一个模型中的所有客户管理等

由于它们在不同的命名空间中,它们不会以那种方式碰撞,因此您应该能够拥有尽可能多的它们。当你想要使用它们时,你只需要正确地引用它们。