2012-09-25 254 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將正常工作。