Entity Framework,使用多个数据库/连接。

6
我有以下问题。我正在使用Entity Framework 6,希望能够在运行时更改所使用的数据库或至少想要检查输入选项中的连接信息。我的问题是,我们希望支持MySql和LocalDB v12.0,因此简单地更换连接字符串并不能解决这个问题 - 我必须更换ExecutionStrategy和ConnectionFactory。
EF似乎锁定了所有配置,因此我无法在运行时更改它,是否有一种解决方法?目前,我尝试创建多个DbConfigurations,并为每个配置派生一个上下文,定义如下:[DbConfigurationType(typeof(LocalDbConfigruation))]
我预计这将失败,但觉得值得一试 ;)
也许有人能够帮助我提供一些提示和技巧。
2个回答

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...           
    }
}

谢谢,我会考虑使用你的解决方案,它看起来非常不错 :) - SirBirne

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";

然后你只需要将代码以某种方式提供给上下文。在我的情况下,我有一个ConnectionManager,在调用MyContext()时从中读取“默认连接”,并且有一个第二个Ctor,我用于“测试连接”。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接