IDENTITY_INSERT 被设置为关闭错误。

10

我有一个MVC web应用程序,其中模型中有一个表格我想要添加。我已经设置了主键以及其他数据字段,但每次尝试向表格添加内容时,都会出现以下错误:

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

我不确定为什么会出现这个问题,我已将主键设置为identity并在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 设计器中所涉及的表的设置/属性 - 您需要确保某些特定的设置 - 有关详细信息,请参阅我的答案。 - marc_s
刚刚编辑了 *.edmx 文件,将与我的主键对应的值从 <Property Name="Id" Type="int" Nullable="false" /> 改成了 <Property Name="Id" Type="int" Nullable="false" StoreGeneratedPattern="Identity" />。只需添加带有其值的属性 StoreGeneratedPattern="Identity" 即可。 - Rubens Mariuzzo
5个回答

15
似乎你的代码试图将一个特定值插入到被定义为IDENTITY的主键列中。
为了避免错误-不要插入任何值!让数据库处理获取你要插入的新行的新值。
如果你正在使用Linq-to-SQL,请点击你视觉化设计中有问题的表格,查看属性。

alt text

"Auto Generated Value"必须为"True"(这不是默认值),且自动同步应为"OnInsert"(同样不是默认值)。此外,将"Primary Key"设置为true,并检查"Server Data Type"是否正确- Int NOT NULL IDENTITY(或类似内容)。
如果您需要覆盖默认行为(通常仅在清理脚本或单独数据操作中),可以在表上打开IDENTITY_INSERT,例如,在此之后,您可以将任何值插入到IDENTITY列中:
SET IDENTITY_INSERT YourTableName ON

INSERT INTO YourTableName(IdentityColumn) VALUES(5555)

SET IDENTITY_INSERT YourTableName OFF

这更像是一项清理/数据管理任务,不是作为开发人员经常应该做的事情。


我尝试在 MSSQL Server Management Studio 的设计器中右键单击表格,但没有看到像你那样的选项。我运行了查询以打开标识插入,但这并没有帮助我的代码向表格中进行编程插入。 - obesechicken13
我在Visual Studio中再次尝试了一下,但我没有看到“主键”选项,只有“实体键”。我看到了类型。我没有看到你看到的其他加粗参数。 - obesechicken13

5
您正在尝试明确设置主键值,可能是在LINQ实体中;例如,您正在尝试将1插入到作为标识的主键字段中,而LINQ将其视为已插入的值。
此外,如果使用LINQ to SQL,在字段的服务器数据类型中,请确保它在数据类型字段中说“IDENTITY”;如果没有说“IDENTITY”,则LINQ中可能存在配置错误。

+1 这就是我想要的结果。=)(语言障碍 =( ) - Will Marcouiller
我实际上正在使用LINQ-to-Entities作为我的模型。 - kingrichard2005
对于LINQ to Entities,至少在4.0版本中,StoreGeneratedPattern应该设置为Identity。我并没有经常使用1.0版本。 - Brian Mains

4
感谢大家的建议,最终我解决了我的问题,方法是对模型进行了一次刷新。我在设置自增标识的主键之前就创建了模型,所以我想它只需要刷新一下就能正常运行了。

2

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

这对我来说起作用了。试一试吧。


0

我遇到了这个问题,通过从模型中删除身份列来解决了它。问题得到了解决。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接