“FromSql”操作的结果中不存在所需的“xxxID”列 - .Net Core EF

问题描述

我正在尝试为 .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 (将#修改为@)