Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/asp.net/35.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 实体框架多对多更新_C#_Asp.net_Asp.net Mvc_Entity Framework - Fatal编程技术网

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
中,则可以正常工作。

您是要更新库中现有的图像,还是要将新图像插入库中?原因:主键强制执行记录唯一的规则(删除重复项)。因此,您不能在表中多次插入同一条记录。引发异常的测试用例正在尝试执行逻辑上不可操作的更新,即不更改图像集。