2

我一直在搜索不同的线程,但无法找到可以让我清楚地了解的答案。

这是场景:

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

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

  1. 对 DB2 使用普通的 SQL 命令并用它们填充视图模型。(我在 DB2 上只有只读访问权限)
  2. 在 DB1 中创建 SQL 视图并生成 EDMX。
  3. 在我的应用程序的上下文中添加 DB2。

我不想使用方法#3,因为我提到 DB2 很大,我只需要使用 DB2 中的几个表。

另外,以防万一我想对 DB1 采用代码优先方法,在这种情况下最好的解决方案是什么。

4

1 回答 1

1

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

我将创建一个具有两个不同上下文的两个 EDMX 设置。像往常一样创建您的应用程序 DB1 上下文,然后创建一个额外的上下文,并且只从 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);
于 2013-10-05T06:49:18.463 回答