在Entity Framework中的运行时期间更改数据库,而不更改Connection

use*_*022 18 c# sql-server entity-framework asp.net-web-api

我有一台服务器托管50个具有相同模式的数据库,我想在下一版本中开始使用Entity Framework.

我不需要为每个数据库建立新连接.一个连接的权限可以与所有50个数据库进行通信,并且对于数据管理和速度(这是一个WebAPI应用程序)我不希望每次与每个数据库通信时实例化一个新的EF上下文,如果我不必,除非当然每次请求到达服务器时都会发生这种情况,那么没什么大不了的.

我真正需要的是能够更改USE [databasename]命令,我假设最终从EF发送到服务器.

有没有办法在代码中实现这一目标?EF是否在Context中保持读/写属性,该属性引用可以在调用SaveChanges()等之前动态更改的数据库名称.

谢谢!!!

短发

小智 13

不要努力工作,聪明地工作!!!!

MYContext localhostContext = new MYContext();
MYContext LiveContext = new MYContext();
//If your databases in different servers
LiveContext.Database.Connection.ConnectionString = LiveContext.Database.Connection.ConnectionString.Replace("localhost", "Live");
//If your databases have different Names
LiveContext.Database.Connection.ConnectionString = LiveContext.Database.Connection.ConnectionString.Replace("DBName-Localhost", "DBName-Live");
Run Code Online (Sandbox Code Playgroud)

数据库的结构应该是相同的;)


ale*_*x.b 5

你可以看看:

  • SO问题有关将现有的SQL连接到的EntityFramework上下文
  • 并在这篇文章中描述了如何更改现有连接上的数据库。

如果需要任何其他帮助,请告诉我。

编辑
更新第二个链接指向SqlConnection.ChangeDatabase方法。
所以最终代码看起来类似于以下内容:

MetadataWorkspace workspace = new MetadataWorkspace(
  new string[] { "res://*/" }, 
  new Assembly[] { Assembly.GetExecutingAssembly() });

using (SqlConnection sqlConnection = new SqlConnection(connectionString))
using (EntityConnection entityConnection = new EntityConnection(workspace, sqlConnection))
using (NorthwindEntities context = new NorthwindEntities(entityConnection))
{
  // do whatever on default database
  foreach (var product in context.Products)
  {
    Console.WriteLine(product.ProductName);
  }

  // switch database
  sqlConnection.ChangeDatabase("Northwind");
  Console.WriteLine("Database: {0}", connection.Database);
}
Run Code Online (Sandbox Code Playgroud)


小智 5

很简单

我有

public WMSEntities() : base("name=WMSEntities") //WMSEntities is conection string name in web.config also the name of EntityFramework
{
}
Run Code Online (Sandbox Code Playgroud)

已经在edmx文件夹的自动生成的Model.Context.cs中。

为了在运行时连接到多个数据库,我创建了另一个构造函数,该构造函数将连接字符串作为参数,如下所示,在同一文件Model.Context.cs中

public WMSEntities(string connStringName)
            : base("name=" + connStringName)
{
}
Run Code Online (Sandbox Code Playgroud)

现在,我在Web.Config中添加了其他连接字符串,例如

<add name="WMSEntities31" connectionString="data source=TESTDBSERVER_NAME;initial catalog=TESTDB;userid=TestUser;password=TestUserPW/>

<add name="WMSEntities" connectionString="data source=TESTDBSERVER_NAME12;initial catalog=TESTDB12;userid=TestUser12;password=TestUserPW12/>
Run Code Online (Sandbox Code Playgroud)

然后,当连接到数据库时,我调用以下方法,将connectionString名称作为参数传递

public static List<v_POVendor> GetPOVendorList(string connectionStringName)
{

   using (WMSEntities db = new WMSEntities(connectionStringName))
   {               
       vendorList = db.v_POVendor.ToList();
   }
}
Run Code Online (Sandbox Code Playgroud)