繁体   English   中英

如何清空EntityFramework DbContext?

[英]How to empty an EntityFramework DbContext?

我如何在不了解其内部对象和类型的情况下清空任意DbContext (擦数据库)

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

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

暂无
暂无

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

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