删除实体框架中的所有实体

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)

当然,如果您的表具有外键关系,则需要按正确的顺序设置表名列表,以便在清除可能依赖的任何主键表之前清除外键表.

  • 但请务必处理和更新您的数据上下文! (4认同)
  • 在EF5中需要像这样:context.Database.ExecuteSqlCommand("TRUNCATE TABLE ["+ tableName +"]"); 来自[野兔](http://stackoverflow.com/questions/13857242/where-is-executestorecommand-in-entity-framework-5) (4认同)
  • 与TRUNCATE相比,DELETE的一个优点是:对于DELETE,角色db_datawriter就足够了,对于TRUNCATE,它不是!这就是为什么我喜欢DELETE,只要性能足够. (3认同)

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)


jol*_*oft 7

对于EF 6:

DbSet<Entity>.RemoveRange(DbSet<Entity>);
Run Code Online (Sandbox Code Playgroud)

  • 这仍然是EF Core的最新信息. (2认同)