4

是否有任何迁移属性或单例类返回实体框架 5/6 迁移中的当前连接字符串?我需要在迁移“Up”方法中使用它,我知道这听起来可能很奇怪,但我需要它来执行一些特定的自动化......

4

2 回答 2

3

Up方法未连接。它只生成稍后将由DbMigrator. 如果您想在迁移期间对连接做任何事情,您唯一的机会就是Seed方法。

于 2013-04-24T22:09:48.453 回答
3

好吧,听起来确实有点“不正统”:),但是...

我建议使用Seed你的方法Configuration

var connection = context.Database.Connection.ConnectionString;

对于向上/向下迁移,您可以执行以下操作...

当您有一个“正在运行”的 DbContext 时,这很有效。

using (var db = new YourDbContext())
{
    var connection = db.Database.Connection.ConnectionString;
}

(我没有尝试过 - 因为它应该运行)


编辑:如何获取没有 DbContext 的连接缓存(实体框架):


我想我现在明白你想要做什么(基于评论)。

您可以all connections使用Reflectionand 从internal static dictionary

IEnumerable<string> EnumerateConnections()
{
    var lazyInternalContextType = typeof(DbContext).Assembly
        .GetType("System.Data.Entity.Internal.LazyInternalContext");
    var propertyDbs = lazyInternalContextType.GetField(
        "InitializedDatabases", 
        BindingFlags.Static | BindingFlags.NonPublic | BindingFlags.Public);
    var lazyContext = propertyDbs.GetValue(null);
    foreach (var pair in (IEnumerable)lazyContext)
    {
        var key = pair.GetType().GetProperty("Key")?.GetValue(pair, null);
        var tuple = (Tuple<System.Data.Entity.Infrastructure.DbCompiledModel, string>)key;
        yield return tuple.Item2; // need to replace "System.Data.SqlClient.SqlConnection;" with "" in EF6.
    }
}

var connectionName = EnumerateConnections().Distinct().SingleOrDefault();

您可以将其放入 Up/Down - 您应该获得一个已使用的“不同”连接。

如果您不混合不同的连接,则此方法有效。在这种情况下,您需要根据您的情况进行调整。

(应该适用于 EF5 和 EF6,类是相同的 - 我只是快速确认了 EF5):

享受 :)

于 2013-04-24T22:11:04.803 回答