2014-03-04 25 views
2

對象圖我的工作表達式樹基本上是:如何更新GraphDiff

public class Resource 
    { 
     public string Forename { get; set; } 
     public string Surname { get; set; } 
     public int EmployeeNumber { get; set; } 
     public ICollection<Skill> Skills { get; set; } 
    } 
public class Skill 
    { 
     public int SkillId{get; private set;} 
     public Technology Technology { get; set; } 
     public SkillCategory Category { get; set; } 
     public SkillCompetency Competency { get; set; }  

    } 

一個新的技能可以通過選擇現有的技術,SkillCategory,SkillCompetency的組合被添加到用戶。我一直在嘗試(並失敗!)使用GraphDiff來防止EF試圖添加重複的技術,SkillCategory,技能能力記錄。 這似乎應該很容易實現使用GraphDiff,但作爲EF夫婦的相對newby,只發現我掙扎的GraphDiff。

任何想法?

+0

另外,如果GraphDiff意外行爲,請不要使用NuGet包,而是從源代碼構建,因爲包當前相當過時。我希望它很快就會更新,儘管.. – andyp

+0

謝謝安迪,我只是試着回答。 GraphDiff看起來完全符合我們的要求,所以如果我們真的可以使用它,那將是非常棒的:-) – DaveF

+0

GraphDiff的NuGet包已經在昨天更新了。 – andyp

回答

2

GraphDiff主要區分兩種關係:擁有關聯擁有的可以解釋爲「作爲其中的一部分」,這意味着擁有的任何東西都將被其所有者插入/更新/刪除。 GraphDiff處理的另一種關係是關聯的這意味着在更新圖時,只有與GraphDiff關聯的關聯實體本身才會更改。

回來到您的場景:你不想重複TechnologyCategoryCompetency實體,但Skills只是這些的組合,因此重複Skills的罰款。要使用這個模型GraphDiff,你告訴它要考慮Skills作爲一個Resource擁有Resource)和TechnologyCategoryCompetency部分作爲協會一個Skill。這是這樣映射的:

// these three entities are all managed separately and have already been saved elsewhere 
Technology entityFrameworkCodeFirst; 
Category objectRelationalMappers; 
Competency notThatIncompetent; 

using (DbContext context = new WhatEverYourContextIsNamed()) 
{ 
    Resource developer = new Resource 
    { 
     Skills = new List<Skill> 
     { 
      new Skill 
      { 
       Technology = entityFrameworkCodeFirst, 
       Category = objectRelationalMappers, 
       Competency = notThatIncompetent, 
      } 
     } 
    }; 
    context.UpdateGraph(developer, 
     map => map.OwnedCollection(r => r.Skills, 
      with => with.AssociatedEntity(skill => skill.Technology) 
         .AssociatedEntity(skill => skill.Category) 
         .AssociatedEntity(skill => skill.Competency))); 
    context.SaveChanges(); 
} 
+0

好的,我試過了你的建議。我想你可能誤解了我的問題。 我面臨的問題是,當我將一項新技能添加到資源中時,技術,技能類別,技能勝任能力的關聯對象被添加爲新項目。由於這些都是參考數據,因此我不希望它們添加。 我想我要做的是將技術,技能類別,技能能力作爲AssociatedCollections的技能,這又是一個AssociatedCollection的資源,但我似乎無法配置它。 – DaveF

+1

你是對的,我昨天誤解了你的問題 - 我已經更新了我的答案,希望我沒有再誤解你.. :) – andyp

+0

謝謝安迪。 上面的代碼是我在你的初始答覆後真正得到的地方。然而它不起作用 - 我得到了開發人員的複製! 我的場景是: 1)創建一個開發人員,添加一項技能,然後更新/保存實體 2)使用相同的開發人員添加第二項技能,然後更新並保存 這給了我第二個開發人員記錄。 我的問題是在第一次更新/保存開發人員ID沒有更新與數據庫標識值。 – DaveF