【问题标题】:How to make entity framework (3.5) skip selection of identity value after insert?如何使实体框架(3.5)在插入后跳过标识值的选择?
【发布时间】:2011-06-23 12:22:25
【问题描述】:

我有一个实体映射到具有自动生成的标识列的数据库表。
创建新实体并调用SaveChanges() 后,EF 执行插入查询,该查询还检索新插入记录的新标识值。

有时我并不关心新值是什么(例如,我插入了一条新的日志记录,但我并不真正关心添加的标识值)。
有什么办法可以让 EF 不查询这个值?

谢谢,
伊泰

【问题讨论】:

    标签: c# .net entity-framework .net-3.5 c#-3.0


    【解决方案1】:

    EDMX 文件使用属性StoreGeneratedPattern="Identity" 定义了此类自动生成的属性。您必须直接修改 EDMX 并从 SSDL(可能还有 CSDL 部分)中删除此属性。更改设计器的值只会修改不负责 SQL 生成的 CSDL 部分。问题是每次从数据库更新后,您的 SSDL 将再次包含此属性,因为身份是在数据库中定义的。

    编辑:

    之前的建议是理论。实际上我认为它不会起作用,因为当您没有将 EDMX 中的列定义为身份时,它会将其实际值发送到数据库。在数据库中它会引发异常,因为您将尝试将值插入标识列而不设置标识插入。

    【讨论】:

    • +1 另外,这样做可能不是一个好主意——这意味着实体内存模型不再与数据库模型一致(即使您承诺尽快处置实体)它已被插入)
    • 谢谢,但正如您所说,插入时可能会引发异常。到目前为止,我想到的唯一解决方案是使用存储过程或自定义 SQL 命令。
    • @Itay:为什么这对你来说是个大问题?标识值是在与插入命令相同的命令批处理中选择的,因此这里的性能下降很小。还有更糟糕的 EF 功能(例如缺少命令批处理)。
    • @LadislavMrnka 我们(我的团队)对此有疑问,更新实体 PK 值的选择(插入后)阻塞了(该表的)页面文件;所以其他 INSERT 会因为页面文件被锁定而失败。我仍在寻找避免这种情况的方法...
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-09-12
    • 1970-01-01
    • 2023-03-10
    • 2015-07-07
    • 2017-03-15
    • 1970-01-01
    • 2017-03-05
    相关资源
    最近更新 更多