Ошибка "Неверное имя столбца" при обновлении с EntityFramework.Extended
Я использую библиотеку https://github.com/loresoft/EntityFramework.Extended для выполнения пакетного обновления. Важные части таблицы, которую я обновляю, выглядят так:
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.Extended есть какая-то ошибка.
Предложения по обходным путям?
1 ответ
Я получил эту же ошибку, но только когда мой 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
, Надеюсь, то же самое относится и к вашему делу.