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

C# 实体框架4,将一个edmx文件的上下文扩展到另一个edmx文件的上下文,c#,.net,asp.net,entity-framework,asp.net-mvc-2,C#,.net,Asp.net,Entity Framework,Asp.net Mvc 2,我的问题是,我们能否在实体框架4中将一个上下文扩展到另一个上下文。以下是问题的背景 我正在使用EF4开发一个Web应用程序。我的Web应用程序有3个项目 其中一个项目用于存储候选人简历信息 另一个项目是存储客户信息 最后一个项目叫做核心。此核心包含一个edmx文件,该文件应由CV和CRM扩展 例如,电子邮件地址表可以由客户(CRM)和简历共享。要将一个表与另一个表共享,我们应该能够用其他上下文(客户上下文)扩展一个上下文(CV上下文)。请有使用实体框架经验的人与我分享您的经验,看看这是否可行

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

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

  • 其中一个项目用于存储候选人简历信息
  • 另一个项目是存储客户信息
  • 最后一个项目叫做核心。此核心包含一个edmx文件,该文件应由CV和CRM扩展
例如,电子邮件地址表可以由客户(CRM)和简历共享。要将一个表与另一个表共享,我们应该能够用其他上下文(客户上下文)扩展一个上下文(CV上下文)。请有使用实体框架经验的人与我分享您的经验,看看这是否可行

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

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

    首先,您的edmx不应该(实际上不能)彼此交谈

    它通常是上下文->EDMX->数据库之间的1-1

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

    每个聚合根目录一个存储库将为您提供PersonRepository、CvRepository和CustomerRepository

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

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

    例如,您可以创建一个CvPersonService,它可以处理与Person(核心)和CV存储库的交互:

    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是不可行的

    这样说:

  • 创建托管在本地PC(DB1)上的数据库
  • 创建托管在internet上的数据库。(DB2)
  • 编写一个查询来连接来自两个表的结果,一个来自DB1,一个来自DB2
  • 你做不到,是吗?实体框架也不能

    即使这三个EDMX/Context都使用同一个数据库,也没关系

    以上是一个更好的解决方案——以一种可以通过fluent存储库优雅地公开模型的方式重新构建它


    HTH

    首先,您的EDMX不应该(实际上不能)彼此交谈

    它通常是上下文->EDMX->数据库之间的1-1

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

    每个聚合根目录一个存储库将为您提供PersonRepository、CvRepository和CustomerRepository

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

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

    例如,您可以创建一个CvPersonService,它可以处理与Person(核心)和CV存储库的交互:

    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是不可行的

    这样说:

  • 创建托管在本地PC(DB1)上的数据库
  • 创建托管在internet上的数据库。(DB2)
  • 编写一个查询来连接来自两个表的结果,一个来自DB1,一个来自DB2
  • 你做不到,是吗?实体框架也不能

    即使这三个EDMX/Context都使用同一个数据库,也没关系

    以上是一个更好的解决方案——以一种可以通过fluent存储库优雅地公开模型的方式重新构建它


    HTH

    你是说你有两个独立的EDMX文件,你想“共享”它们吗?“两个模块”是什么意思?两级图书馆?请重新回答你的问题。(同时提及您使用的EF版本)是的,我在3个项目中有3个edmx文件。其中一个edmx文件是colled Core,另外两个是CV和CRM,我想将Core继承到中CV@Kltis-我还是不明白。你想达到什么目标?我们需要比“扩展上下文”更多的信息。上下文适用于一个EDMX。您好,RPM1984,感谢您关注此问题,我们已更新了我们的问题,请参阅主要问题的底部。@Kltis-请参阅答案,如果您需要更多信息,请告诉我。您是说您有两个单独的EDMX文件,并且您想“共享”它们吗?“两个模块”是什么意思?两级图书馆?请重新回答你的问题。(同时提及您使用的EF版本)是的,我在3个项目中有3个edmx文件。其中一个edmx文件是colled Core,另外两个是CV和CRM,我想将Core继承到中CV@Kltis-我还是不明白。你想干什么