图片有很多画廊,画廊有很多图像。我正在尝试更新图库所具有的图像。下面的代码有效,但感觉有点笨拙。
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'.
你能解释一下原因吗?有没有更好的方法来解决这个问题?
答案 0 :(得分:1)
当您执行g.Images.Add(im)
时,如果表格中已存在galleryId
,则实体框架会在imageId
表中添加一个新行dbo.GalleryImages
和g.Images=ims
另一方面,当你执行g.Images=ims
时,实际上是在告诉实体框架添加新关系(GalleryImages表中的新行)。如果您要将新图片添加到图库中{{1}},那么工作正常。