我有一个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();
}
}
}
答案 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)
我遇到了这个问题,并通过从模型中删除标识列来解决它。这清除了它