【问题标题】:Delete all rows from a table with an Entity Framework function using C#使用 C# 从具有实体框架函数的表中删除所有行
【发布时间】:2020-07-04 08:18:48
【问题描述】:

我想从我的 SQL Server 数据库中的表中删除所有行(如屏幕截图所示):

为此,我正在使用以下功能:

private readonly DatabaseContext _context;

[HttpDelete]
public async Task DeleteInstances()
{
    _context.Alertings.RemoveRange();
    await _context.SaveChangesAsync();
}

DbContext 我有这个:

public class DatabaseContext : DbContext
{
        public DatabaseContext(DbContextOptions<DatabaseContext> options) : base(options)
        {
        }

        public DbSet<AlertingDataModel> Alertings { get; set; }
}

而我的AlertingDataModel 是:

[Table("Alerting")]
public class AlertingDataModel
{
    [Key]
    public int Id { get; set; }
    public string Name { get; set; }
    public string Instance { get; set; }
    public string Serverity { get; set; }
    public string Summary { get; set; }
    public string State { get; set; }
    public string ActiveAt { get; set; }
}

我研究过,我找到了这个方法

context.Database.ExecuteSqlCommand("TRUNCATE TABLE [TableName]");

但我认为这是一种旧方法,我使用的是 ASP.NET Core 3.1.1。

如果有人能帮助我,我将非常感激:)

【问题讨论】:

  • But I think it's an old method ← 为什么?根据您想要使用纯 EF 方法清空的表中的记录数可能会很好,但您必须检索记录然后删除它们。如果表可以包含许多记录,则首选 DELETE FROM 或 TRUNCATE TABLE。
  • 我觉得直接sql执行不好?这就是我被告知的,我正在寻找一个像@David 给出的函数
  • 原始 sql 的性能会更高,但如果表中的记录数有限,这可能根本不重要。您选择的内容应基于您的需求以及您期望表格包含的内容。
  • 我将记录很多关于 Alerting 历史的记录,现在我必须创建一个不断调用 Add 方法的后台服务,我想我可能会使用 5 分钟的计时器,我不知道它是否是可选的,我也不知道如何使用这些后台服务,无论如何我会去阅读文档,谢谢你的帮助:)

标签: c# asp.net sql-server entity-framework


【解决方案1】:

原始 SQL 是执行此类批量更改的首选方法。但最好的方法是获取所有 ID 并构造仅填充 ID 的“存根实体”实例。

EG

var toDelete = db.Alerts.Select(a => new Alert { Id = a.Id }).ToList();
db.Alerts.RemoveRange(toDelete);
db.SaveChanges();

【讨论】:

    猜你喜欢
    • 2013-02-19
    • 2011-08-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-06-22
    • 2011-12-26
    • 1970-01-01
    相关资源
    最近更新 更多