无效的列名"使用EntityFramework.Extended执行更新时出错

本文关键字:Extended EntityFramework 执行 更新 出错 使用 quot 无效 | 更新日期: 2023-09-27 18:12:50

我使用的是EntityFramework。扩展库来执行一组批处理更新。我正在更新的表的重要部分如下所示:

CREATE TABLE [dbo].[BoosterTargetLog]
(
    [Id] BIGINT NOT NULL identity PRIMARY KEY,
    [CustomerUserId] INT NULL,
    CookieId uniqueidentifier not null,
    CONSTRAINT [FK_BoosterTargetLog_ToOrganizationCookie] FOREIGN KEY (CookieId) REFERENCES [OrganizationCookie]([CookieId])
)

c#的更新代码是这样的:

var query = db.BoosterTargetLogs
    .Where(x =>
        x.OrganizationCookie.OrganizationId == organizationId &&
        x.CookieId == cookieId &&
        x.CustomerUserId == null);
var updated = await query.UpdateAsync(x => new BoosterTargetLog
{
    CustomerUserId = customerUserId
});

生成如下的SQL更新代码:

exec sp_executesql N'UPDATE [dbo].[BoosterTargetLog] SET 
[CustomerUserId] = @p__update__0 
FROM [dbo].[BoosterTargetLog] AS j0 INNER JOIN (
SELECT 
    [Extent2].[OrganizationId] AS [OrganizationId], 
     CAST( [Extent1].[Id] AS int) AS [C1]
    FROM  [dbo].[BoosterTargetLog] AS [Extent1]
    INNER JOIN [dbo].[OrganizationCookie] AS [Extent2] ON [Extent1].[CookieId] = [Extent2].[CookieId]
    WHERE ([Extent2].[OrganizationId] = @p__linq__0) AND ([Extent1].[CookieId] = @p__linq__1) AND ([Extent1].[CustomerUserId] IS NULL)
) AS j1 ON (j0.[Id] = j1.[Id])',N'@p__linq__0 int,@p__linq__1 uniqueidentifier,@p__update__0 int',@p__linq__0=1075,@p__linq__1='44A191F0-9086-4867-9777-ACEB9BB3B944',@p__update__0=95941

当我运行更新,无论是通过c#代码,或者如果我手动执行生成的SQL,我得到这个错误:

Invalid column name 'Id'.

问题是生成的SQL中有一个错误。请注意下面这段内容:

 AS j1 ON (j0.[Id] = j1.[Id])

实际上应该是:

 AS j1 ON (j0.[Id] = j1.[C1])

那么,我的假设是EntityFramework中存在某种bug。扩展库。

解决方法的建议?

无效的列名"使用EntityFramework.Extended执行更新时出错

当我的Where子句不匹配任何项目时,我收到了同样的错误,但只有

请检查是否有匹配的数据:

var query = db.BoosterTargetLogs
    .Where(x =>
        x.OrganizationCookie.OrganizationId == organizationId &&
        x.CookieId == cookieId &&
        x.CustomerUserId == null);

我把检查,以确保我有一些记录更新,也许试试这个:

if (query.Any())
{
    var updated = await query.UpdateAsync(x => new BoosterTargetLog
    {
        CustomerUserId = customerUserId
    });
}

我不使用UpdateAsync虽然,只是普通的Update。希望这同样适用于您的情况。