2016-08-11 5 views
0

FK関係(1対多)を持つ2つのテーブルで、EF(モデルファースト)を使用して一括挿入しようとしています。以下のコードでは、すべてのチャレンジエントリが正しく挿入されますが、X個の不足分だけが挿入されます。私の期待...私は2つの課題で10の不足があります。 2つのチャレンジエントリと20の不足エントリを受け取る必要があります。私は挿入された最初の不足のための10のチャレンジエントリーを見るだけです。 (下のコードは簡略化されています)FKの関連モデルを使用したEF 6 'Bulk' insert

//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メソッドは浅いクローンであり、すべてのオブジェクトを通過せずクローンしません。したがって、10個の同一項目を持つ2つのリストがあります(項目の各ペアはまったく同じメモリ参照を指しています)。あなたがする必要がどのような

は、次のようなものである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

oops編集を参照してください。 'new'キーワードを削除しました –

+0

ありがとうございます。私がモデルファーストクラスをオーバーライドしていなかった場合、それはうまくいくかのように見えます。私は、複数のCLR型がEDMタイプ 『不足』と一致しているため曖昧であるEDM型へのCLR型の「マッピング を得る。 は、以前のCLR型 『StandardDB.Shortage』、新たに発見されたCLRタイプ「WebApps.Controllers.ChallengeController +不足を見つけましたそれは不足の集まりだったので「」エラー –

関連する問題