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();
}