2012-09-25 123 views
0

的图像有许多画廊,画廊有许多图像。我正在尝试更新图库的图像。下面的代码工作,但感觉有点笨拙。实体框架许多一对多更新

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

你想*更新*现有的图像,画廊拥有,或者是你想插入* *新的图像变成一个画廊? – Thousand

+0

的原因是:主键强制执行的规则,一个记录是唯一(删除重复)。所以你不能在表格中多次插入相同的记录。 –

+0

会抛出异常的测试用例试图做一个更新,其中逻辑是无操作。即不改变该组图像。 – Tom

回答

1

当你这样做g.Images.Add(im),实体框架将在dbo.GalleryImages表,如果它不存在于表中添加具有galleryIdimageId一个新行。

在otherhand,当你做g.Images=ims,你实际上讲的实体框架添加一个新的关系(新行GalleryImages表)。如果你是新的图像添加到图库g.Images=ims将正常工作。