2017-02-01 4 views
0

Ich habe die folgenden Objekte in meinem Projekt. Das "Gast" -Objekt kann viele "Aufenthalt" -Objekte haben und das "Aufenthalt" -Objekt kann viele "Mitreisender" -Objekte haben. Jeder "Mitreisender" kann nur einem "Aufenthalt" zugeordnet werden und jeder "Aufenthalt" kann nur einem Gast zugeordnet werden.Entityframework ID nicht gesetzt

Wenn ich Button2 klicken dann funktioniert alles, aber nur die ID für den "Gast" ist Null in dem Aufenthalt ..

public class Gast 
{ 
    public int GastID { get; set; } 
    public string Anrede { get; set; } 
    public string Titel { get; set; } 
    public string Vorname { get; set; } 
    public string Nachname { get; set; } 

    public virtual List<Aufenthalt> Aufenthalte {get; set;} 

    public Gast() 
    { 
     Aufenthalte = new List<Aufenthalt>(); 
    } 
} 

public class Mitreisender 
{ 
    public int MitreisenderID { get; set; } 
    public string Anrede { get; set; } 
    public string Titel { get; set; } 
    public string Vorname { get; set; } 
    public string Nachname { get; set; } 
    public DateTime Geburtstag { get; set; } 

    public virtual Aufenthalt Aufenthalt { get; set; } 
} 

public class Aufenthalt 
{ 
    public int AufenthaltID { get; set; } 
    public DateTime Anreisedatum { get; set; } 
    public DateTime Abreisedatum { get; set; } 

    public virtual List<Mitreisender> Mitreisende { get; set; } 

    public virtual Gast Gast { get; set; } 

    public Aufenthalt() 
    { 
     Mitreisende = new List<Mitreisender>(); 
    } 
} 

meine DbContext

[DbConfigurationType(typeof(MySqlEFConfiguration))] 
class GastContext : DbContext 
{ 
    public DbSet<Gast> Gaeste { get; set; } 
    public DbSet<Aufenthalt> Aufenthalte { get; set; } 
    public DbSet<Mitreisender> Mitreisende { get; set; } 
} 

meine Taste

private void button2_Click(object sender, EventArgs e) 
    { 
     using (var db = new GastContext()) 
     { 
      Aufenthalt aufenthalt = new Aufenthalt(); 
      aufenthalt.Anreisedatum = dtp_aufenthalt_anreise.Value; 
      aufenthalt.Abreisedatum = dtp_aufenthalt_abreise.Value; 

      foreach (ListViewItem lvi in lv_aufenthalt_mitreisende.Items) 
      { 
       Mitreisender m = new Mitreisender 
       { 
        Anrede = lvi.SubItems[0].Text, 
        Vorname = lvi.SubItems[1].Text, 
        Nachname = lvi.SubItems[2].Text 
       }; 

       db.Mitreisende.Add(m); 
       aufenthalt.Mitreisende.Add(m); 
      } 

      currentGast.Aufenthalte.Add(aufenthalt); 
      db.Aufenthalte.Add(aufenthalt); 

      db.SaveChanges(); 

      MessageBox.Show("Aufenthalt wurde angelegt"); 
     } 
    } 
+1

Wie bekommt 'currentGast' seinen Wert? – haim770

Antwort

2

currentGast wird nicht vom Kontext überwacht, da Sie im Ereignishandler einen neuen Kontext erstellt haben.

diesen Code löschen:

currentGast.Aufenthalte.Add(aufenthalt); 
db.Aufenthalte.Add(aufenthalt); 

db.SaveChanges(); 

zu diesem Code ersetzen es:

var cg = db.Gaste.Single(x => x.GastID == currentGast.GastID); 
cg.Aufenthalte.Add(aufenthalt); 
db.SaveChanges(); 
0

Neben @ jannagy02 Antwort: Sie auch currentGast auf den Kontext anhängen könnte. Anstatt also

currentGast.Aufenthalte.Add(aufenthalt); 
db.Aufenthalte.Add(aufenthalt); 

db.SaveChanges(); 

würden Sie haben

db.Gaste.Attach(currentGast); 
currentGast.Aufenthalte.Add(aufenthalt); 

db.SaveChanges(); 

Wie janagy02 unten stellt fest: Dies wird nur funktionieren, wenn currentGast nicht bereits an einen anderen DbContext angebracht ist. In diesem Fall würde ich jedoch anmerken, dass die Verwendung mehrerer offener DbContext s (die an die gleiche Datenbank angehängt sind) im selben Antwort-Kontext der Anwendung keine Übung ist, die ich empfehlen würde.

+1

Ja, aber weil wir nicht den gesamten Code sehen, könnte es sein, dass currentGast bereits an eine andere Instanz des Kontexts angehängt ist, und dann gibt es eine Ausnahme. – jannagy02

Verwandte Themen