【问题标题】:Using Specific table/s of a different Database in Entity Framework MVC在实体框架 MVC 中使用不同数据库的特定表
【发布时间】:2013-10-05 05:45:53
【问题描述】:

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

这是场景:

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

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

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

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

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

【问题讨论】:

  • 您始终可以选择否。数据库优先方法中的表...因为它是一个单独的数据库,我建议使用 context.database.sqlquery(query,params) 直接针对该数据库触发 sql 查询

标签: asp.net-mvc entity-framework


【解决方案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);

【讨论】:

  • 谢谢,我会试试这个。如果先使用 DB1 的代码会有什么区别
  • 您必须在提供现有 DB1 结构和功能的代码中指定 POCO、所有关系和约束(很可能您需要使用 fluent)。在这种情况下,这可能是您实际上不需要做的工作,因为您已经拥有 DB1。有一些工具采用 DB First 并让您使用 Code First 获得新版本。如果您希望坚持导入 DB2,则对 DB2 没有任何影响。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2012-09-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多