如何在Entity Framework迁移中获取当前连接字符串?

时间:2013-04-24 21:40:10

标签: c# .net entity-framework

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

2 个答案:

答案 0 :(得分:2)

Up方法未连接。它只会生成稍后由DbMigrator执行的操作。如果您想在迁移期间对连接执行任何操作,则唯一的机会是Seed方法。

答案 1 :(得分:0)

听起来确实有点'非正统':),但是......

我建议您使用Seed

Configuration方法
var connection = context.Database.Connection.ConnectionString;

对于向上/向下移植,你可以做这样的事情......

当你有'正在运行'的DbContext时,这是有效的。

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

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


编辑:如何使用DbContext(实体框架)获取连接缓存:

<小时/> 我想我现在明白你要做的事情(基于评论)。

您可以使用all connectionsReflection

获取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.GetProperty<object>("Key");
        var tuple = (Tuple<System.Data.Entity.Infrastructure.DbCompiledModel, string>)key;
        yield return tuple.Item2;
    }
}

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

你可以把它放到Up / Down中 - 你应该得到一个'不同'的连接。

这可以让您不要混合不同的连接。在这种情况下,您需要根据您的方案进行调整。

(应该适用于EF5和EF6,类是相同的 - 我刚刚确认它对EF5来说很快):

享受:)