【问题标题】:Stop LINQ to SQL from executing select statements after insert插入后停止 LINQ to SQL 执行选择语句
【发布时间】:2009-01-02 18:59:09
【问题描述】:

我正在使用 LINQ to SQL 来更新我的数据库。我插入了很多记录,当我调用 SubmitChanges() 时,LINQ to SQL 为每个对象执行一个插入和一个选择语句。在将对象插入数据库后,我真的不关心更新对象。

您知道我可以阻止 LINQ to SQL 在插入语句之后发出选择语句吗?这应该会使我的应用程序更快。

【问题讨论】:

    标签: sql-server linq sql-server-2005 linq-to-sql


    【解决方案1】:

    您正在寻找ColumnAttribute.AutoSync。如果您使用设计器,请检查每一列的自动同步属性并将其设置为从不。

    编辑: 好的,这对你不起作用。为一些映射黑客做好准备!

    当我插入一些自动生成的主键列时,我得到了这个 SQL:

    INSERT INTO [dbo].[TableName]( fieldlist )
    VALUES (@p0, @p1, @p2, @p3, @p4)
    
    SELECT CONVERT(Int,SCOPE_IDENTITY()) AS [value]
    

    据我了解你的要求,你不想要那个 SELECT

    尝试 1:我转到主键字段并将自动生成设置为 false。这导致了 Sql 异常“当 IDENTITY_INSERT 设置为 OFF 时,无法在表 'TableName' 中插入标识列的显式值。”换句话说,linq 为该列指定了一个值。

    尝试 2:我从设计器中删除了自动生成的列。这导致 Linq 给我一个无效的操作异常:“无法对 'Table(TableName)' 执行创建、更新或删除操作,因为它没有主键。”

    尝试 3:我从设计器中删除了自动生成的列,然后我将另一列标记为主键。即使此列不是数据库中的主键,LINQ 的 DataContext 也会使用它来跟踪行标识。对于给定 DataContext 的观察记录,它必须是唯一的。

    第三次尝试生成了以下 SQL(这是您要求的)

    INSERT INTO [dbo].[TableName]( fieldlist )
    VALUES (@p0, @p1, @p2, @p3, @p4)
    

    【讨论】:

    • 感谢您的建议。我这样做了,但探查器在插入和更新后仍然显示选择。我不知道为什么。
    • 我有两列标记为 AutoGeneratedValue 设置为 true。 select 语句在插入和更新后选择这两列,即使 AutoSync 设置为 false。
    • 对于第一次使用 ADO.Net 就可以正常工作的事情来说,这似乎是一项荒谬的工作
    • then I marked another column as primary key - 这怎么可能,因为 SQL 查询将使用unique value 更新此列,这很可能导致错误数据。
    • @ViRuSTriNiTy 它不需要在表中是唯一的。它只需要从 DataContext 实例的角度来看是唯一的,并且只有在该上下文跟踪对象的更改时才需要。如果您一次插入 1 条记录,则您已经赢了。如果您有时正在阅读记录,您可以在这些情况下禁用对象跟踪。如果您要更新或删除,则要困难得多。 (固定语法)
    【解决方案2】:

    我现在不记得设置了,但是在设计器中,在列的属性上,您有一些“刷新”设置。

    【讨论】:

      【解决方案3】:

      我曾经在一个项目中遇到过这个问题。我只是使用了 context.ExecuteCommand({sql string here.})。这是针对一个导致性能问题的插入。在我看来,最简单的修复,易于查看和维护,而不是挖掘模型。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2018-07-18
        • 2017-05-29
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多