文章内容

2017/9/11 11:39:46,作 者: 黄兵

附加类型“BlogAppDAL.Entities.Archives”的实体失败,因为相同类型的其他实体已具有相同的主键值。

最近在写代码的时候遇到如下错误:

附加类型“BlogAppDAL.Entities.Archives”的实体失败,因为相同类型的其他实体已具有相同的主键值。在使用 "Attach" 方法或者将实体的状态设置为 "Unchanged" 或 "Modified" 时如果图形中的任何实体具有冲突键值,则可能会发生上述行为。这可能是因为某些实体是新的并且尚未接收数据库生成的键值。在此情况下,使用 "Add" 方法或者 "Added" 实体状态跟踪该图形,然后将非新实体的状态相应设置为 "Unchanged" 或 "Modified"。

截图如下:

解决方案:

看一下原来代码如下所示:

var FirstItem = Archives.OrderByDescending(n => n.Id);
//如果年月不想等,则在相应表增加,之后插入Blogs表,相等获得当前id,加入相应表
if (YearToMonStr != FirstItem.FirstOrDefault().ArchivesName)
{
Archives Archive = new BlogAppDAL.Entities.Archives();
Archive.ArchivesName = YearToMonStr;
uow.ArchivesRepostiory.Insert(Archive);
//增加年月份之后文章数量增加1
Archive.ArchivesCount = Archive.ArchivesCount + 1;
uow.ArchivesRepostiory.Update(Archive);
uow.SaveChanges();

var FirstItemId = Archives.OrderByDescending(n => n.Id).FirstOrDefault().Id;
blog.ArchivesId = FirstItemId;
}
else
{
//注意:封装
var FirstItemId = FirstItem.Where(x => x.ArchivesName == YearToMonStr).FirstOrDefault();
Archives archivesModel = new Archives();
archivesModel.ArchivesName = FirstItemId.ArchivesName;
archivesModel.ArchivesCount = FirstItemId.ArchivesCount + 1;
archivesModel.Id = FirstItemId.Id;
uow.ArchivesRepostiory.Update(archivesModel);
uow.SaveChanges();
blog.ArchivesId = FirstItemId.Id;
}

修改后的代码如下:

var FirstItem = Archives.AsNoTracking().ToList().OrderByDescending(n => n.Id);
//如果年月不想等,则在相应表增加,之后插入Blogs表,相等获得当前id,加入相应表
if (YearToMonStr != FirstItem.FirstOrDefault().ArchivesName)
{
Archives Archive = new BlogAppDAL.Entities.Archives();
Archive.ArchivesName = YearToMonStr;
uow.ArchivesRepostiory.Insert(Archive);
//增加年月份之后文章数量增加1
Archive.ArchivesCount = Archive.ArchivesCount + 1;
uow.ArchivesRepostiory.Update(Archive);
uow.SaveChanges();

var FirstItemId = Archives.OrderByDescending(n => n.Id).FirstOrDefault().Id;
blog.ArchivesId = FirstItemId;
}
else
{
//注意:封装
var FirstItemId = FirstItem.Where(x => x.ArchivesName == YearToMonStr).FirstOrDefault();
Archives archivesModel = new Archives();
archivesModel.ArchivesName = FirstItemId.ArchivesName;
archivesModel.ArchivesCount = FirstItemId.ArchivesCount + 1;
archivesModel.Id = FirstItemId.Id;
uow.ArchivesRepostiory.Update(archivesModel);
uow.SaveChanges();
blog.ArchivesId = FirstItemId.Id;
}

注意上面红色部分的修改。

在网上找了这一篇文章:一例附加类型“LMSoft.FrameWork.Identity.ApplicationUser”的实体失败,因为相同类型的其他实体已具有相同的主键值错误的解决

”使用了不同的数据库上下文“,这里应该不是这样的。

又看了csdn上面的一篇问答,地址:http://bbs.csdn.net/topics/391993581,是因为:一个线程内打开两个表,所以出错。

我的情况应该是这种情况。


参考资料:cnblgos - Amyn - 附加类型的实体失败,因为相同类型的其他实体已具有相同的主键值。在使用 "Attach" 方法或者将实体的状态设置为 "Unchanged" 或 "Modified" 时如果图形中的任何实体具有冲突键值

分享到:

发表评论

评论列表