我的项目中有以下对象。 " Gast" -Object可以有许多" Aufenthalt" -Objects和" Aufenthalt" -Object可以有许多" Mitreisender" -Object。每个" Mitreisender"可以只分配给一个" Aufenthalt"和每一个" Aufenthalt"可以只分配给一个Gast。
当我点击Button2时,一切正常,但只有" Gast"在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");
}
}
答案 0 :(得分: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();
答案 1 :(得分: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
时才会有效。但是,在这种情况下,我会注意到在同一个应用程序响应上下文中有多个open DbContext
(附加到同一个数据库)并不是我建议的做法。