4

Entity Framework 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 なしで接続キャッシュを取得する方法 (Entity Framework):


(コメントに基づいて)あなたがやろうとしていることを今理解したと思います。

all connectionsとを使用Reflectionして取得できます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 に入れることができます - そして、使用された 1 つの「別個の」接続を取得する必要があります。

これは、異なる接続を混在させない限り機能します。その場合、シナリオに基づいてこれを微調整する必要があります。

(EF5とEF6の両方で機能するはずです。クラスは同じです-EF5で高速であることを確認しました):

楽しみ :)

于 2013-04-24T22:11:04.803 に答える