2

DbContext内部オブジェクトと型に関する知識がなくても、任意のものを空にするにはどうすればよいですか? (データベースを消去)

残念ながら、これを行う一般的な方法はありません。しかし、これは、ローカルのテストデータに対してテストを行う場合などに便利です。

4

1 に答える 1

3

非常に洗練された方法でリフレクションを使用することで解決できました。奇妙に見えますが、C# は一般的なワイルドカードをサポートしていないため、一般Java<?>的なメソッドが必要であり、リフレクションによって呼び出す必要があります。確かにソリューションの実行速度は遅いですが、ローカル テスト、デバッグ、および開発の問題には十分な速さです。

    public static void GenericRemoveSet<T>(System.Data.Entity.DbSet<T> set) where T:class
    {
        foreach (var item in set) set.Remove(item);
    }

    public static void ClearGenericDbContext(DbContext context)
    {
        var removeMethod = System.Reflection.MethodBase.GetCurrentMethod().DeclaringType.GetMethod("GenericRemoveSet");
        foreach (var prop in context.GetType().GetProperties().Where(p => p.PropertyType.IsGenericType && p.PropertyType.GetGenericTypeDefinition() == typeof(System.Data.Entity.DbSet<>)))
        {
            var typedRemove = removeMethod.MakeGenericMethod(prop.PropertyType.GetGenericArguments().First());
            typedRemove.Invoke(null, new object[]{prop.GetValue(context)});
        }
        context.SaveChanges();
    }
于 2013-08-13T16:51:04.723 に答える