【问题标题】:IDENTITY_INSERT is set to off errorIDENTITY_INSERT 设置为关闭错误
【发布时间】:2011-02-20 13:25:53
【问题描述】:

我有一个 MVC Web 应用程序,模型中有一个表,我想添加到其中。我将主键与其他数据字段一起设置,但每次尝试添加到表中时,都会出现以下错误:

“当 IDENTITY_INSERT 设置为 OFF 时,无法为表 'TABLE_NAME' 中的标识列插入显式值。”

我不确定为什么会出现这个问题,我将主键设置为标识,并且它还在 Visual Studio 表设计器中设置为自动递增。有什么方法可以在 Visual Studio 的表设计器中调整 IDENTITY_INSERT 参数?或者是否有其他问题可能导致此问题。

更新:@Brian - 据我所知,我没有明确设置值,这是添加到表中的代码。

//Add viewer
public void addViewer(ModelStateDictionary modelState, Users user)
{
   var userToAdd = new UserRoles();
   userToAdd.Users = user;

   if (String.IsNullOrEmpty(userToAdd.Users.Username))
   {
      modelState.AddModelError("noName", "Please enter a username for the new Viewer");
   }

   //See if Committee Member already exists
   try
   {
      userToAdd = _db.UserRoles.First(ur => ur.Users.Username == userToAdd.Users.Username);
      modelState.AddModelError("userExists", "A Viewer with that username already exists in the system");
      return;
    }
    catch (Exception e)
    {
       if (modelState.IsValid)
       {
          //Assign Committee Member role
          userToAdd.Role = "Viewer";
          userToAdd.Users = user;
          //Add new Committee Member to User Roles and associated username to Users
          _db.AddToUserRoles(userToAdd);
          _db.SaveChanges();
       }
    }
}

【问题讨论】:

  • 在您的 Linq-to-SQL 设计器中检查相关表的设置/属性 - 您需要确保某些特定设置 - 请参阅我的答案了解详细信息。
  • 刚刚编辑了*.edmx,将我的主键对应的值从<Property Name="Id" Type="int" Nullable="false" />更改为<Property Name="Id" Type="int" Nullable="false" StoreGeneratedPattern="Identity" />。它只是添加属性及其值:StoreGeneratedPattern="Identity"

标签: asp.net sql asp.net-mvc tsql


【解决方案1】:

您的代码似乎正在尝试将特定值插入到定义为 IDENTITY 的主键列中。

为避免错误 - 不要插入任何值!让数据库处理为您插入的行获取新值。

如果您使用的是 Linq-to-SQL,请在可视化设计器中单击有问题的表,然后查看属性:

“自动生成值”必须为“True”(这不是默认值),并且自动同步应该是“OnInsert”(再次强调:不是默认值)。此外,将“主键”设置为 true,并检查以确保“服务器数据类型”正确 - Int NOT NULL IDENTITY(或类似的东西)。

如果您需要覆盖默认行为(通常仅在清理脚本或一次性数据操作中),您可以打开表上的 IDENTITY_INSERT,例如之后,您可以在 IDENTITY 列中插入任何您喜欢的值:

SET IDENTITY_INSERT YourTableName ON

INSERT INTO YourTableName(IdentityColumn) VALUES(5555)

SET IDENTITY_INSERT YourTableName OFF

这更像是一种清理/数据管理类型的任务 - 作为开发人员,你不应该一直这样做。

【讨论】:

  • 我尝试在 mssql 服务器管理工​​作室的设计器中右键单击表格,但没有看到像您所做的那样。我运行了查询以打开身份插入,但这并没有帮助我的代码以编程方式插入到表中。
  • 我在 Visual Studio 中再次尝试了这个。我没有看到“主键”只有“实体键”的选项。我确实看到了类型。我没有看到您看到的任何其他粗体参数。
【解决方案2】:

您可能正在尝试在 LINQ 实体中显式设置主键值;例如,您想说的是,在作为标识的主键字段中插入 1,而 LINQ 将其视为插入值。

另外,如果使用 LINQ to SQL,在字段的服务器数据类型中,确保它在数据类型字段中显示 IDENTITY;如果没有显示 IDENTITY,则可能是 LINQ 配置错误。

【讨论】:

  • +1 这就是我想要的。 =) (语言障碍 =( )
  • 我实际上在为我的模型使用 LINQ-to-Entities。
  • StoreGeneratedPattern 应该说 LINQ to Entities 的 Identity,至少对于 4.0。没有大量使用 1.0。
【解决方案3】:

感谢大家的建议,我最终通过刷新模型解决了我的问题。我的模型是在我将主键设置为具有自动增量的身份规范之前创建的,所以我想它所需要的只是刷新即可。

【讨论】:

    【解决方案4】:

    如果您使用的是 LinQ to SQL。只需通过右键单击表并选择“从模型中删除”选项从 .edmx 文件中删除您的表。然后通过右键单击 .edmx 文件并选择“从数据库更新模型...”选项来更新您的 .edmx 文件。

    它对我有用..试试看..

    【讨论】:

      【解决方案5】:

      我遇到了这个问题,并通过从模型中删除标识列来解决它。就这样搞定了

      【讨论】:

        猜你喜欢
        • 2015-10-18
        • 2013-03-22
        • 2020-07-26
        • 2011-05-06
        • 2013-06-09
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2017-03-03
        相关资源
        最近更新 更多