更新时生成 SQL 插入以及更新

Posted

技术标签:

【中文标题】更新时生成 SQL 插入以及更新【英文标题】:A SQL insert is generated as well as an update when updating 【发布时间】:2012-06-19 02:51:44 【问题描述】:

我正在使用 Entity Framework 4 自我跟踪实体模板 (STE) 和 SQL Server CE。我看到一些非常奇怪的行为。如果我只是插入或更新、删除,一切都会很好。但是,如果我插入一个对象,然后对其进行更新,则会在执行更新时为该对象生成 UPDATEINSERT SQL 语句(见下文)。

我正在使用存储库模式,并且我处理了存储库以及它为每个调用包装的ObjectContext,因此更新使用新的ObjectContext。另请注意,如果我重新启动服务器,对象的更新工作正常,所以只有我插入了一个对象的情况。

由于我使用的是 STE,因此更新执行“常规”ApplyChangesSaveChanges

初始插入的跟踪是:

Creating ComputerEntities
--=============== BEGIN COMMAND ===============

declare @0 UniqueIdentifier set @0 = '2975bbbb-36a1-4c0a-8075-be273a96cd42'
declare @1 Bit set @1 = 'True'
declare @2 UniqueIdentifier set @2 = '2913bff8-9f2b-4965-8e02-5cb2a98f4498'
declare @3 Int set @3 = '2'
declare @4 Int set @4 = '1'
declare @5 NVarChar set @5 = 'test'
declare @6 NVarChar set @6 = 'C:\ProgramData\Kailana\ReVersion\Repositories\Projects\2975bbbb-36a1-4c0a-8075-be273a96cd42\2975bbbb-36a1-4c0a-8075-be273a96cd42'

insert [Repository]([Id], [Enabled], [ComputerId], [SQLVersionId], [ReleaseId], [Name], [Description], [DataSource], [Password], [DbUser], [DbUserPassword])
values (@0, @1, @2, @3, @4, @5, null, @6, null, null, null)

go

--=============== END COMMAND ===============
处置存储库 处置存储库上下文。

接下来我进行更新,这是生成的 SQL:

Creating ComputerEntities
--=============== BEGIN COMMAND ===============

declare @0 Bit set @0 = 'True'
declare @1 UniqueIdentifier set @1 = '2913bff8-9f2b-4965-8e02-5cb2a98f4498'
declare @2 Int set @2 = '2'
declare @3 Int set @3 = '1'
declare @4 NVarChar set @4 = 'tested'
declare @5 NVarChar set @5 = 'C:\ProgramData\Kailana\ReVersion\Repositories\Projects\2975bbbb-36a1-4c0a-8075-be273a96cd42\2975bbbb-36a1-4c0a-8075-be273a96cd42'
declare @6 UniqueIdentifier set @6 = '2975bbbb-36a1-4c0a-8075-be273a96cd42'

update [Repository]
set [Enabled] = @0, [ComputerId] = @1, [SQLVersionId] = @2, [ReleaseId] = @3, [Name] = @4, [Description] = null, [DataSource] = @5, [Password] = null, [DbUser] = null, [DbUserPassword] = null
where ([Id] = @6)
go

-=============== END COMMAND ===============
--=============== BEGIN COMMAND ===============

declare @0 UniqueIdentifier set @0 = '2975bbbb-36a1-4c0a-8075-be273a96cd42'
declare @1 Bit set @1 = 'True'
declare @2 UniqueIdentifier set @2 = '2913bff8-9f2b-4965-8e02-5cb2a98f4498'
declare @3 Int set @3 = '2'
declare @4 Int set @4 = '1'
declare @5 NVarChar set @5 = 'test'
declare @6 NVarChar set @6 = 'C:\ProgramData\Kailana\ReVersion\Repositories\Projects\2975bbbb-36a1-4c0a-8075-be273a96cd42\2975bbbb-36a1-4c0a-8075-be273a96cd42'

insert [Repository]([Id], [Enabled], [ComputerId], [SQLVersionId], [ReleaseId], [Name], [Description], [DataSource], [Password], [DbUser], [DbUserPassword])
values (@0, @1, @2, @3, @4, @5, null, @6, null, null, null)
go

--=============== END COMMAND ===============

对于造成这种情况的原因,我已经用尽了所有想法,因此,如果您有任何可以让我转向新方向的想法,我们将不胜感激。

谢谢, 瑞克

【问题讨论】:

【参考方案1】:

成功插入实体后,尝试在实体上调用AcceptChangesMarkAsUnchanged

【讨论】:

以上是关于更新时生成 SQL 插入以及更新的主要内容,如果未能解决你的问题,请参考以下文章

SQL插入,使用合并存储过程更新

如何使用 excel 生成大型更新 sql 语句?

如何生成 sql 命令以使用其他列更新主键

如何在使用 jooq 生成的 dao 插入/更新后获取插入/更新的对象

使用快照隔离防止 SQL 视图被冗长的删除/插入事务阻塞

如何将自定义sql附加到Spring Data JPA插入/更新