C# 实体框架多对多更新
一个图像有许多图库,一个图库有许多图像。我正在尝试更新图库中的图像。下面的代码可以工作,但感觉有些笨拙C# 实体框架多对多更新,c#,asp.net,asp.net-mvc,entity-framework,C#,Asp.net,Asp.net Mvc,Entity Framework,一个图像有许多图库,一个图库有许多图像。我正在尝试更新图库中的图像。下面的代码可以工作,但感觉有些笨拙 var g=db.Galleries.Find(gal.Id); var ims = gal.Images.Select(i => db.Images.Where(im => im.Id == i.Id && im.User.Id == user.Id)).SelectMany(im => im).ToList(); g.Name = g
var g=db.Galleries.Find(gal.Id);
var ims = gal.Images.Select(i => db.Images.Where(im => im.Id == i.Id && im.User.Id == user.Id)).SelectMany(im => im).ToList();
g.Name = gal.Name;
g.Images.Clear();
foreach (var im in ims)
{
g.Images.Add(im);
}
db.SaveChanges();
当我这样做时:
g.Images=ims;
而不是:
g.Images.Clear();
foreach (var im in ims)
{
g.Images.Add(im);
}
将引发异常:
Violation of PRIMARY KEY constraint 'PK_GalleryImages'. Cannot insert duplicate key in object 'dbo.GalleryImages'.
你能解释一下原因吗?有更好的方法吗?当您执行
g.Images.Add(im)
时,实体框架将在dbo.gallerymages
表中添加一个带有galleryId
和imageId
的新行,如果它在表中尚不存在
另一方面,当您执行
g.Images=ims
时,实际上是在告诉实体框架添加一个新关系(GalleryImages表中的新行)。如果要将新图像添加到库g.images=ims
中,则可以正常工作。您是要更新库中现有的图像,还是要将新图像插入库中?原因:主键强制执行记录唯一的规则(删除重复项)。因此,您不能在表中多次插入同一条记录。引发异常的测试用例正在尝试执行逻辑上不可操作的更新,即不更改图像集。