IDENTITY_INSERT设置为关闭错误

时间:2010-05-17 18:38:27

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

我有一个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();
       }
    }
}

5 个答案:

答案 0 :(得分:15)

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

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

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

alt text http://i39.tinypic.com/bgzs6d.png

“自动生成的值”必须为“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

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

答案 1 :(得分:5)

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

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

答案 2 :(得分:4)

谢谢大家的建议,我最终通过刷新模型解决了我的问题。在我使用自动增量将主键设置为Identity规范之前,我的模型已经创建,所以我想所需要的只是刷新才能实现。

答案 3 :(得分:2)

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

它的工作对我来说..试试..

答案 4 :(得分:0)

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