问题描述
我正在尝试为 .NET Core EF (3.1.9) 中的批量删除找到更好且性能高效的方法。 (一次删除大约 500K 到 100 万条记录。)
型号:
public class Employee
{
[Key,DatabaseGenerated(DatabaseGeneratedOption.Identity)]
public int EmpID { get; set; }
public string EmpName { get; set; }
}
和数据库表为:
CREATE TABLE [dbo].[Employee]
(
[EmpID] [int] IDENTITY(1,1) NOT NULL,[EmpName] [nchar] (20) NULL,CONSTRAINT [PK_dbo].[Employee]
PRIMARY KEY CLUSTERED ([EmpID] ASC)
WITH (PAD_INDEX = OFF,STATISTICS_NORECOMPUTE = OFF,IGNORE_DUP_KEY = OFF,ALLOW_ROW_LOCKS = ON,ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
) ON [PRIMARY]
尝试使用通用方法 1 删除记录。
public int Delete<TEntity>(Func<TEntity,bool> predicate) where TEntity: class
{
return DbContext.Set<TEntity>
.FromSqlRaw($"Delete from dbo.Employee")
.Where(predicate).Count();
}
并将此方法调用为
Func<Employee,bool> myPredicate = x => x.EmpID > 10;
int deletedCount = myclass.Delete(myPredicate);
抛出异常:
InvalidOperationException:“FromSql”操作的结果中不存在所需的列“EmpID”。
ASP.NET Core EF 生成查询:
DELETE FROM [dbo].[Employee]
失败:Microsoft.EntityFramework.Query[10100] .... 堆栈跟踪出现上述错误。
已经研究过这个:
.NET Core Entity Framework InvalidOperationException
The required column 'CustomerId' was not present in the results of a 'FromSql' operation
The required column 'id' was not present in the results of a `FromSql` operation in EFcore
所以不确定为什么会抛出上述错误。由于数据库具有正确的 PK,模型也具有它。也尝试过其他一些实体,它总是抛出与列名 'xxxEntityColID' 相同的错误。
但是,如果我使用以下代码,则它可以工作:
public int Delete<TEntity>(string whereCondition,params object[] parameters) where TEntity: class
{
return DbContext.Database.ExecuteSqlRaw($"Delete from dbo.Employee WHERE {whereCondition}",parameters);
}
// and calling like
string myCondition = "EmpID > 10";
int deletedCount = myclass.Delete<Employee>(myCondition,new object[0]);
.NET Core EF 生成以下 SQL 并且没有任何错误。
DELETE FROM [dbo].[Employee] WHERE EmpID > 10;
问题
- 为什么会出现“xxxEntityColID”错误?
- 在 .NET Core EF 中执行批量删除的更好方法是什么?
解决方法
暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!
如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。
小编邮箱:dio#foxmail.com (将#修改为@)