使用Entity Framework MVC中不同数据库的特定表

时间:2013-10-05 05:45:54

标签: asp.net-mvc entity-framework

我一直在寻找不同的主题,但无法找到能给我清晰画面的答案。

以下是该方案:

我正在使用MVC创建一个应用程序&实体框架DB首先。我有两个数据库,DB1是我的应用程序的专用数据库,DB2是许多其他应用程序使用的巨大的通用数据库。我只需要使用DB2中的特定表/视图。

以下是我可以使用的方法:

  1. 对DB2使用普通SQL命令,并使用它们填充视图模型。 (我只对DB2有只读访问权限)
  2. 在DB1中创建SQL视图并生成EDMX。
  3. 在我的应用程序的上下文中添加DB2。
  4. 我不想使用方法#3,因为我提到DB2很庞大,我只需要使用DB2中的几个表。

    另外,为了防止我想使用DB1的代码优先方法,在这种情况下最好的解决方案是什么。

1 个答案:

答案 0 :(得分:1)

我经常有三个以上模型的项目,因为我们有很多数据库。

我会创建一个具有两个不同上下文的两个EDMX设置。像往常一样创建应用程序DB1 Context然后创建一个额外的上下文,只从DB2中获取您感兴趣的那些表。

为了让您的生活更轻松,更容易维护,通常只需为每个模型创建一个DLL,使其具有自己的命名空间,这样您就可以区分DB1中的用户和DB2中的用户,并添加或从一个实体中移除实体而不影响另一个实体。

每个DLL都有一个app.config连接字符串,可以获取数据,例如

<add name="DB1Entities" connectionString="metadata=res://*/DB1Model.csdl|res://*/DB1Model.ssdl|res://*/DB1Model.msl;provider=System.Data.SqlClient;provider connection string=&quot;data source=(local);initial catalog=ClientDb;integrated security=True;MultipleActiveResultSets=True;App=EntityFramework&quot;" providerName="System.Data.EntityClient" /&gt;

<add name="DB2Entities" connectionString="metadata=res://*/DB2Model.csdl|res://*/DB2Model.ssdl|res://*/DB2Model.msl;provider=System.Data.SqlClient;provider connection string=&quot;data source=(local);initial catalog=ClientMaster;integrated security=True;MultipleActiveResultSets=True;App=EntityFramework&quot;" providerName="System.Data.EntityClient"/&gt;

<add name="DefaultConnection" connectionString="Data Source=(local);Initial Catalog=Reports;Integrated Security=True;MultipleActiveResultSets=True" providerName="System.Data.SqlClient"/>

请记住将每个连接字符串从Dll的App.config复制到您的应用程序app.config或您的web.config文件中。

在你的项目中引用DLL,然后加载你的上下文。

DB1Entities DB1Context = new DB1Entities()
DB2Entities DB2Context = new DB2Entities()

您现在可以愉快地区分DB1和DB2实体,并像这样使用其中一个内容。

var address1 =  DB1Context.Addresses.Single(a => a.AddressId == 1);
var address2 =  DB2Context.Addresses.Single(a => a.Id == address1.GlobalAddressId);