实体框架4,将一个edmx文件的上下文扩展到另一个edmx文件的上下文

时间:2010-10-14 03:18:27

标签: c# .net asp.net entity-framework asp.net-mvc-2

我的问题是我们可以在实体框架4中将一个上下文扩展到另一个上下文。以下是问题背景。

我正在使用EF4开发Web应用程序。我的Web应用程序有3个项目。

  • 一个项目用于存储候选人CV信息。
  • 另一个项目是存储客户信息。
  • 最终项目名为CORE。此CORE包含一个edmx文件,该文件应由CV和CRM扩展。

作为示例,电子邮件地址表可以由客户(CRM)和CV共享。要与另一个表共享一个表,我们应该能够使用其他上下文(客户上下文)扩展一个上下文(CV上下文)。有些使用实体框架经验的人可以与我分享您的经验,以确定这是否可行。

我们在三个类库中有3个edmx文件:

  1. 具有core.edmx的人员类库(核心) - 与人相关的基本详细信息(姓名,电子邮件)
  2. 具有CV.edmx的CV类库,其具有CV相关数据(实验,技能)
  3. 客户关系管理系统(CRM),其中包含客户数据(销售数据......)
  4. 然后我们要使用核心类库edmx文件(Core.edmx)和cv.edmx(基本上cv表应该能够使用核心表中的表)。  同样,我们希望将core.edmx与CRM.edmx一起用于第三个项目

1 个答案:

答案 0 :(得分:4)

首先,你的EDMX不应该(实际上不能)互相交谈

上下文之间通常为1-1 - > EDMX - >数据库中。

更好的解决方案是将模型封装在存储库后面。

每个聚合根一个存储库将为您提供一个PersonRepository,CvRepository,CustomerRepository。

每个DLL都可以公开一个存储库。

然后,您需要一个“服务层”,它可以与存储库一起使用。类似于“工作单位”。

例如,您可以创建一个CvPersonService,它可以处理与Person(Core)和CV Repositories的交互:

using PersonRepository;
using CvRepository;

public class CvPersonService
{
   public CvPerson GetHydratedCvPersonFromTwoRepositories()
   {
        var person = personRepository.Find(1); // get a person
        var cv = cvRepository.Find(1); // get a cv

        return new CvPerson { ThePerson = person, TheCv = cv };
   }
}

需要注意的重要事项是,EF不会对数据库连接和上下文做出任何假设。与特定上下文关联的数据库可以位于本地计算机,开发服务器或云上。 EF不知道(或关心)数据库的位置。您的配置中的SQLProvider特定于此。 EF必须假设它可以在任何地方。

因此,您无法将查询从一个上下文“加入”到另一个上下文。这怎么样?也许在“老派”中,您可以使用链接服务器,但对于这样的ORM来说这是不可行的。

这样说:

  1. 创建托管在本地PC(DB1)上的数据库
  2. 创建托管在互联网上的数据库。 (DB2)
  3. 编写查询以连接两个表的结果,一个来自DB1,一个来自DB2。
  4. 你不能这样做吗?实体框架也不能。 :)

    即使所有三个EDMX / Context都使用相同的数据库,也没关系。

    以上是一个更好的解决方案 - 以一种可以通过流畅的存储库优雅地展示模型的方式对其进行重新架构。

    HTH