2017-02-01 58 views
0

我的項目中有以下對象。 「Gast」對象可以有許多「Aufenthalt」對象,而「Aufenthalt」對象可以有許多「Mitreisender」對象。每個「Mitreisender」只能分配給一個「Aufenthalt」,每個「Aufenthalt」只能分配給一個Gast。實體框架ID未設置

當我點擊Button2的則一切正常,但只適用於 「加斯特」 的ID在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>(); 
    } 
} 

我的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; } 
} 

我的按鈕

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

'currentGast'如何獲得它的價值? – haim770

回答

2

currentGast沒有被上下文跟蹤,因爲您已經在事件處理程序中創建了新的上下文。

刪除此代碼:

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

db.SaveChanges(); 

它替換到這個代碼:

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

除了@ jannagy02的回答是:你還可以附加currentGast上下文。所以,與其

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

db.SaveChanges(); 

你必須

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

db.SaveChanges(); 

由於janagy02下面的註釋:本如果currentGast尚未連接到另一個DbContext纔會工作。但是,在這種情況下,我會注意到在同一個應用程序響應環境中有多個開放的DbContext(連接到同一個數據庫)不是我會推薦的做法。

+1

是的,但是因爲我們沒有看到所有代碼,所以可能是currentGast已經連接到上下文的另一個實例,然後出現異常。 – jannagy02