C# 在实体框架插入上停止作用域标识

C# 在实体框架插入上停止作用域标识,c#,entity-framework,C#,Entity Framework,目前,我们在应用程序中进行了大量插入,其中我们不关心由此插入生成的ID 在查看SQL profiler之后,插入之后总是有一个SCOPE_IDENTITY语句来获取对象的ID,在负载下,这会影响性能并创建不必要的数据库锁 有没有办法要求Entity Framework在不更新ID的情况下添加对象?只是不要将EF用于批量插入。主要的延迟是每一个新行产生一个单独的插入,并带有相应的开销和锁定。是INSERT获取锁,而不是SCOPE\u IDENTITY。用于以最小的阻塞和(重要的)插入多行。性能差异

目前,我们在应用程序中进行了大量插入,其中我们不关心由此插入生成的ID

在查看SQL profiler之后,插入之后总是有一个SCOPE_IDENTITY语句来获取对象的ID,在负载下,这会影响性能并创建不必要的数据库锁


有没有办法要求Entity Framework在不更新ID的情况下添加对象?

只是不要将EF用于批量插入。主要的延迟是每一个新行产生一个单独的插入,并带有相应的开销和锁定。是
INSERT
获取锁,而不是
SCOPE\u IDENTITY
。用于以最小的阻塞和(重要的)插入多行。性能差异可能是数量级的。很难相信SCOPE_IDENTITY()是锁定的。在insert执行其工作时,它更可能是一个表锁。表上有多少/什么类型的索引?这张桌子有多大?你能对insert语句运行一些分析吗?我们讨论的是多少行?这是insert和SCOPE_IDENTITY()调用之间的锁。在一个简单的测试中,我碰巧发现了
SELECT SCOPE_IDENTITY
insert
的锁行为。在两个SSMS选项卡中开始两个事务,先插入一个简单的
INSERT
,然后从[System_Journal]中选择[IDC],其中@ROWCOUNT=1和[IDC]=scope_identity()(查询由实体框架生成)。第二个选项卡将挂起,直到您在第一个选项卡中调用
COMMIT TRANSACTION
。如果移除
选择
并只保留
插入
,则不会创建锁。