实体框架,使用多个数据库/连接

时间:2015-02-09 11:31:35

标签: c# mysql entity-framework

我有以下问题。我正在使用Entity Framework 6,我希望能够在运行时或至少更改已使用的数据库我希望能够在选项中输入时检查连接信息。我的问题是我们想支持MySql和LocalDB v12.0这么简单的交换连接字符串在这里没有用 - 我必须交换ExecutionStrategy和ConnectionFactory。

EF似乎锁定了所有配置,因此我无法在运行时更改它,是否有针对此的工作原理?目前,我尝试创建多个DbConfiguration,并为每个配置派生一个上下文,定义为[DbConfigurationType(typeof(LocalDbConfigruation))]

我预计这会失败,但我认为这值得一试;)

也许有人可以帮助我解决一些问题和技巧。

2 个答案:

答案 0 :(得分:1)

还有另一种选择利用基础上下文。 在下面的示例中,我使用的是MSSQL连接和Oracle连接。 您可以扩展您希望的许多数据库连接类型的基本上下文。这种方法开辟了许多其他很好的可能性,但它也适用于你的情况。

BaseContext.cs

using System.Data.Entity;

namespace MultipleConnections.Models
{
    public class BaseContext<TContext> : DbContext where TContext : DbContext
    {
        static BaseContext()
        {
            Database.SetInitializer<TContext>(null);
        }

        public BaseContext(string connectionString = "Name=MSSQLEntities")
            : base(connectionString)
        {}
    }
}

MSSQLModel.cs

using System.Data.Entity;

namespace MultipleConnections.Models
{
    // Extending Base Context will use default MSSQLEntities connection
    public class MSSQLContext : BaseContext<MSSQLContext>
    {
       ...apply DbSet<> and other loveliness...           
    }
}

OracleModel.cs

using System.Data.Entity;

namespace MultipleConnections.Models
{
    // Extending Base Context
    public class OracleContext : BaseContext<OracleContext>
    {
        // Declare Oracle connection in Constructor to override default
        // MSSQL connection
        public OracleContext()
            : base("Name=OracleEntities")
        { }
       ...apply DbSet<> and other loveliness...           
    }
}

答案 1 :(得分:0)

好的,现在问题似乎已经解决了。我现在正在使用DbConnections。

public MyContext() : base(ConnectionManager.Connection, true)
{
    Database.SetInitializer<MyContext>(new MyContextInitializer());
    Configuration.ProxyCreationEnabled = false;
}

public MyContext(DbConnection connection) : base(connection, true)
{
    Database.SetInitializer<MyContext>(new MyContextInitializer());
    Configuration.ProxyCreationEnabled = false;
}

我在一个特殊的类中创建了DbConnection,我认为在这里发布代码是不合适的。但它基本上是这样的:

DbConnection conn = null;

switch (Type)
{
   case ConnectionType.LocalDB:
      conn = DbProviderFactories.GetFactory("System.Data.SqlClient").CreateConnection();
      break;
   case ConnectionType.MySql:
      conn = DbProviderFactories.GetFactory("MySql.Data.MySqlClient").CreateConnection();
      break;
   default:
      throw new System.InvalidOperationException();
}

conn.ConnectionString = "Add provider specific connection string here";

然后你只需要将代码somhow提供给上下文。在我的情况下,我有一个ConnectionManager,我从那里读到&#34; defaul连接&#34;当我打电话给MyContext()并且有一个我要求的第二个Ctor&#34;测试连接&#34;。