Asp.net 在EF 6-中创建记录时出错;无法为表“中的标识列插入显式值”;照片;当标识“插入”设置为“关闭”时;
我最近将我的应用程序从ASP.NET MVC 3和EF 4升级到ASP.NET MVC 5和EF 6。我有几个用于CRUD功能的存储库函数 我没有更改任何内容,但如果我尝试向实体添加记录,我会突然收到此错误: 当identity\u insert设置为OFF时,无法在表“Photos”中插入identity列的显式值 下面是其中一种方法的示例Asp.net 在EF 6-中创建记录时出错;无法为表“中的标识列插入显式值”;照片;当标识“插入”设置为“关闭”时;,asp.net,asp.net-mvc,entity-framework,asp.net-mvc-5,entity-framework-6,Asp.net,Asp.net Mvc,Entity Framework,Asp.net Mvc 5,Entity Framework 6,我最近将我的应用程序从ASP.NET MVC 3和EF 4升级到ASP.NET MVC 5和EF 6。我有几个用于CRUD功能的存储库函数 我没有更改任何内容,但如果我尝试向实体添加记录,我会突然收到此错误: 当identity\u insert设置为OFF时,无法在表“Photos”中插入identity列的显式值 下面是其中一种方法的示例 public void SavePhoto(Photo photo) { if (photo.PhotoID == 0)
public void SavePhoto(Photo photo)
{
if (photo.PhotoID == 0) // new photo
_entities.Photos.Add(photo);
else // edit photo
{
_entities.Photos.Attach(photo);
_entities.Entry(photo).State = EntityState.Modified;
}
_entities.SaveChanges();
}
我的数据库中此表的PhotoID
列被设置为标识。当这之前起作用时,它只会根据最后一个条目(如预期)增加PhotoID
列值
现在使用EF 6有更好的方法吗?您的PhotoId列是否为“int”类型并用“DateGenerated identity”注释?如果是这样,以下代码将出错。因为EF可能认为您正在将0插入标识列
if (photo.PhotoID == 0) // new photo
_entities.Photos.Add(photo);
使用id==0检查它是否是一张新照片不是一个好的做法,实际上这是一个“错误”,因为假设系统中有3条记录(默认值可能意味着你的photoid不大于4),不知何故你的photoid在后端被操纵为100,现在当你的代码运行时,你的代码将其状态设置为修改。EF可能会为您抛出错误,或者EF可能会尝试为您插入错误,而不是进行编辑
所以我建议使用下面的代码
var photo = _entities.Photos.Find(photo.PhotoId)
if (photo == null) {
//your code to add photo
}
else
{
//your code to set the the modal state to modified.
}
这似乎没有错。我已经在我的repository类上查看了Add、Update和AddOrUpdate方法,它们基本上做了相同的事情。唯一的区别是我没有检查ID=0,而是使用类似if(_entitites.Photos.Contains(photo))Update(photo)的东西;您是否尝试过以下任何一种方法:查看照片实体的其他导航模型。我曾经遇到一个实体的问题,结果是它的导航属性有问题。