繁体   English   中英

如何在实体框架迁移中获取当前连接字符串?

[英]How to get the current connection string inside an Entity Framework migration?

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

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

嗯,这听起来确实有点“非正统”:),但是......

我建议使用您的ConfigurationSeed方法

var connection = context.Database.Connection.ConnectionString;

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

当您有一个“正在运行”的 DbContext 时,这会起作用。

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

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


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


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

您可以使用Reflectioninternal static dictionary获取all connections

 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 快速确认了它):

享受 :)

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM