Car*_*s00 55 .net c# wpf entity-framework
我想使用Entity Framework 4+删除所有表(所有实体)的内容.如何才能做到这一点?
Joe*_*ler 47
假设底层数据库是MSSQL ,这将比涉及删除单个实体对象的任何内容执行得更好,更好.
foreach (var tableName in listOfTableNames)
{
context.ExecuteStoreCommand("TRUNCATE TABLE [" + tableName + "]");
}
Run Code Online (Sandbox Code Playgroud)
当然,如果您的表具有外键关系,则需要按正确的顺序设置表名列表,以便在清除可能依赖的任何主键表之前清除外键表.
Woj*_*ski 13
只是为了懒惰,代码我在寻找答案时自己出现了:
public static void ClearDatabase<T>() where T : DbContext, new()
{
using (var context = new T())
{
var tableNames = context.Database.SqlQuery<string>("SELECT TABLE_NAME FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_TYPE = 'BASE TABLE' AND TABLE_NAME NOT LIKE '%Migration%'").ToList();
foreach (var tableName in tableNames)
{
context.Database.ExecuteSqlCommand(string.Format("DELETE FROM {0}", tableName));
}
context.SaveChanges();
}
}
Run Code Online (Sandbox Code Playgroud)
简短说明:由于缺少权限,我不会截断表,如果这对你来说不是问题,请随意这样做.where语句忽略表__MigrationHistory.
更新:经过一些研究后,我提出了更好的解决方案(不是很好但只删除了所需的列):
public static void ClearDatabase(DbContext context)
{
var objectContext = ((IObjectContextAdapter)context).ObjectContext;
var entities = objectContext.MetadataWorkspace.GetEntityContainer(objectContext.DefaultContainerName, DataSpace.CSpace).BaseEntitySets;
var method = objectContext.GetType().GetMethods().First(x => x.Name == "CreateObjectSet");
var objectSets = entities.Select(x => method.MakeGenericMethod(Type.GetType(x.ElementType.FullName))).Select(x => x.Invoke(objectContext, null));
var tableNames = objectSets.Select(objectSet => (objectSet.GetType().GetProperty("EntitySet").GetValue(objectSet, null) as EntitySet).Name).ToList();
foreach (var tableName in tableNames)
{
context.Database.ExecuteSqlCommand(string.Format("DELETE FROM {0}", tableName));
}
context.SaveChanges();
}
Run Code Online (Sandbox Code Playgroud)
对于EF 6:
DbSet<Entity>.RemoveRange(DbSet<Entity>);
Run Code Online (Sandbox Code Playgroud)