2016-08-11 3 views
0

Ich versuche, Bulk einfügen mit EF (Modell zuerst) auf zwei Tabellen, die eine FK-Beziehung (eins zu viele) haben. Der unten stehende Code fügt alle Challenge-Einträge korrekt ein, fügt jedoch nur einmal den X-Betrag ein. Meine Erwartung ... Ich habe 10 Engpässe mit 2 Herausforderungen. Ich sollte 2 Challenge-Einträge und 20 Short-Einträge erhalten. Ich sehe nur 10 Challenge-Einträge für den ersten eingefügten Mangel. (der folgende Code ist vereinfacht)EF 6 'Bulk' einfügen mit FK relationed Modelle

//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(); 
     } 
    } 

Antwort

2

Sie erstellen nur 10 Engpässe im Speicher. Ihre Clone Methode ist ein seichter Klon und durchläuft nicht jedes Objekt. Daher haben Sie 2 Listen mit 10 identischen Elementen (jedes Paar von Elementen zeigt auf genau die gleiche Speicherreferenz).

Was Sie tun müssen, ist DeepClone, die so etwas wie das ist folgende:

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

     return res; 
    } 

Und in Ihrem Mangel Klasse:

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

Beachten Sie, dass, wenn innerhalb Mangel eines dieser Objekte verweisen auf eine andere Entität, jedes Paar zeigt auf dieselbe Entität.

Suche nach DeepClone für weitere Informationen

+0

Vielen Dank, dass Sie mich in die richtige Richtung zeigen. Ihr Code oben erzeugt diesen Fehler. (lokale Variable) Mangel s. 's' ist eine Variable, wird aber wie ein Typ verwendet. –

+0

oops siehe bearbeiten ,. Entfernte 'neues' Schlüsselwort –

+0

Danke. Es scheint, als würde es funktionieren, wenn ich nicht ein Modell der ersten Klasse außer Kraft setzen würde. Ich erhalte eine "Die Zuordnung von CLR-Typ zu EDM-Typ ist mehrdeutig, weil mehrere CLR-Typen mit dem EDM-Typ 'Knappheit' übereinstimmen. Zuvor gefunden CLR-Typ 'StandardDB.Shortage', neu gefunden CLR-Typ 'WebApps.Controllers.ChallengeController + Knappheit '"Fehler –