如何清空EntityFramework DbContext?

时间:2013-08-13 16:51:05

标签: c# .net entity-framework dbcontext

如何在不知道其内部对象和类型的情况下清空任意DbContext? (擦除数据库)

不幸的是,没有通用的方法来做到这一点。但这很有用,即在对本地测试数据进行测试时。

1 个答案:

答案 0 :(得分:2)

我能够以非常复杂的方式使用反射来解决它。它看起来很奇怪,但由于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();
    }