2016-08-11 33 views
0

我想在兩個具有FK關係(一對多)的表上使用EF(模型優先)批量插入。下面的代碼正確插入了所有挑戰條目,但僅插入一次X量短缺。我的期望......我有10個短缺和2個挑戰。我應該收到2個挑戰條目和20個短缺條目。我只看到10個挑戰條目插入第一個短缺。 (下面的代碼被簡化)與FK關係模型的EF 6'Bulk'插入

//class for cloning Shortage collection 
public class ShortageCollection : Collection<Shortage> 
    { 
     public ShortageCollection(IList<Shortage> source) : base(source) { } 

     public ShortageCollection() { } 

     public ShortageCollection Clone() 
     { 
      return Clone(this); 
     } 
     public static ShortageCollection Clone(ShortageCollection shortage) 
     { 
      var res = new ShortageCollection(); 
      foreach (var s in shortage) 
      { 
       res.Add(s.Clone()); 
      } 
     } 
    } 

public class Shortage : StandardDB.Shortage 
    { 
     public Shortage Clone() 
     { 
      return new Shortage() 
      { 
       PART_NUMBER = this.PART_NUMBER, 
       Note = this.Note, 
       Qty = this.Qty, 
       ResponseMachine = this.ResponseMachine 
      }; 
     } 
    } 

public void CreateChallenge() 
    { 
     var JSONJobs = new JavaScriptSerializer().Deserialize<string[]>(Jobs); 
     var JSONParts = new JavaScriptSerializer().Deserialize<ChallengePartsList[]>(Parts); 
     using (ARTEntities art = new ARTEntities()) 
     { 
      art.Configuration.AutoDetectChangesEnabled = false; 
      art.Configuration.ValidateOnSaveEnabled = false; 

      ShortageCollection sColl = new ShortageCollection(); 
      foreach(var part in JSONParts) 
      { 
       Shortage s = new Shortage() 
       { 
        PART_NUMBER = part.Invid, 
        Note = Challenge, 
        Qty = part.Qty, 
        ResponseMachine = ResponseMachine 
       }; 
       sColl.Add(s); 
      } 

      foreach (var job in JSONJobs) { 
       Challenge c = new Challenge() 
       { 
        InitiatorORG = Org, 
        TypeID = TypeID, 
        DISCRETE_JOB = job, 
        InitiatorPERSON_ID = InitiatorPersonID, 
        InitiatedDate = datenow, 
        Challenge1 = Challenge, 
        ChampionGroupID = ChampionGroupID, 
        StatusID = StatusID, 
        InitiatorGroupID = InitiatorGroupID, 
        DivisionID = DivisionID, 
        Shortages = sColl.Clone() 
       }; 
       art.Challenges.Add(c); 
      } 
      art.SaveChanges(); 
     } 
    } 

回答

2

你只是在內存中創建10個短缺。您的Clone方法是淺層克隆,並且不會經過並克隆每個對象。因此,您有2個列表和10個相同的項目(每對項目指向完全相同的內存引用)。

你需要做的是DeepClone這是類似以下內容:

public static ShortageCollection Clone(ShortageCollection shortage) 
    { 
     var res = new ShortageCollection(); 
     foreach(var s in shortage) { 
      res.Add(s.Clone()); 
     } 

     return res; 
    } 

而在你的短缺類:

public class Shortage 
{ 
    public Shortage Clone() 
    { 
     return new Shortage() 
     { 
      SomeProp = this.SomeProp, 
      SomeOtherProp = this.SomeOtherProp 
     } 
    } 
} 

注意,如果裏面短缺的任何對象指向另一個實體,每一對將指向同一個實體。

搜索DeepClone獲取更多信息

+0

感謝您指點我正確的方向。你上面的代碼產生這個錯誤。 (局部變量)短缺s。 's'是一個變量,但用於類型。 –

+0

哎呀看編輯。刪除了'new'關鍵字 –

+0

謝謝。看起來,如果我不是壓倒一流的模特,它就會起作用。我得到一個「CLR類型到EDM類型的映射 含糊不清,因爲多個CLR類型匹配EDM類型'Shortage'。 以前發現的CLR類型'StandardDB.Shortage',新發現的CLR類型'WebApps.Controllers.ChallengeController + Shortage '「error –