【问题标题】:Writing to the database from LINQ in C#在 C# 中从 LINQ 写入数据库
【发布时间】:2011-04-23 02:19:54
【问题描述】:

我正在尝试通过 LINQ 将一些内容写入我的数据库。目前,我收到以下错误:

Cannot insert explicit value for identity column in table 'MyTable' when IDENTITY_INSERT is set to OFF.

我了解这是与主键相关的问题。我的表将身份规范设置为“是”,身份增量设置为“1”。但我已经使用如下代码成功更新了其他表:

using (DataModelDataContext context = new DataModelDataContext())
{
  List<MyTable> newRecords = new List<MyTable>();
  MyTable record1 = new MyTable();
  record1.CreatedBy = GetUserName();
  record1.Information = GetInformation();
  newRecords.Add(record1);

  MyTable record2 = new MyTable();
  record2.CreatedBy = GetUserName();
  record2.Information = GetInformation();
  newRecords.Add(record2);

  context.MyTables.InsertAllOnSubmit(newRecords);
  context.SubmitChanges();
}

什么会导致这个错误?如果我想写新记录,有没有办法在发送到数据库之前设置主键?像“GetNextKey()”之类的东西?基本上,我只需要插入这些记录。我做错了什么?

谢谢!

【问题讨论】:

    标签: c# linq


    【解决方案1】:

    假设这些字段都没有identity 值,您发布的代码将起作用。您基本上需要确保在将项目添加到 Table 集合之前不要尝试设置标识值。 (实际上,在大多数情况下,当它要在数据库中生成时,您不应该从代码中设置标识值)。

    所以在某处,有错误的代码正在尝试设置标识字段的值。

    【讨论】:

      【解决方案2】:

      如果 ID 很重要(假设您正在导入数据,并且稍后要插入的记录将引用这些记录),则在执行插入时暂时关闭身份。如果在每条记录上都有一个特定的 ID 无关紧要,并且您可以让标识列选择一个(这是 99.9% 的时间),请确保在尝试保存记录之前没有为 ID 指定值.还要确保对象和数据库之间的映射指定 ID 是一个身份,因此 EF 知道不要尝试插入 ID 列。

      【讨论】:

        【解决方案3】:

        检查以确保您的主键/身份列在 DBML 中具有以下设置:

        • 自动生成值:真
        • 自动同步:OnInsert

        这将确保 LINQ-To-SQL 不会尝试将键值插入该列,并且会在插入发生后更新该值。这些应该在您将表添加到 DBML 时打开。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2021-03-02
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2019-03-18
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多