未设置实体框架ID

时间:2017-02-01 12:19:04

标签: entity-framework

我的项目中有以下对象。 " 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");
        }
    }

2 个答案:

答案 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(附加到同一个数据库)并不是我建议的做法。