断开连接的实体,其中多个“子级引用”指向相同的现有实体

时间:2019-04-09 14:25:26

标签: c# entity-framework-6

当我尝试为实体集合设置对同一外键的引用时,我遇到了实体断开的问题。我在这里编写了一个简单的代码版本(这个代码没用,但是给出了相同的错误):

Prenotazione prenotazione = new Prenotazione();

        prenotazione.Soggiorni = new List<Soggiorno>();

        for (int i = 0; i < 3; i++)
        {
            Soggiorno soggiorno = new Soggiorno();
            soggiorno.Addebiti = new List<Addebito>();

            prenotazione.Soggiorni.Add(soggiorno);

            for (int j = 0; j < 3; j++)
            {
                soggiorno.Addebiti.Add(new Addebito { AddebitoID = 1 });
            }
        }

        using (HotelContext context = new HotelContext())
        {
            context.Prenotazioni.Add(prenotazione);

            foreach (Soggiorno soggiorno in prenotazione.Soggiorni)
            {
                foreach (Addebito addebito in soggiorno.Addebiti)
                {
                    context.Entry(addebito).State = System.Data.Entity.EntityState.Unchanged;
                }
            }

            context.SaveChanges();
        }

奇怪的行为是关于

Entry(addebito).State

如果我仅使用一个“ soggiorno”(即在第一个for语句中,我输入i <1),则完全没有问题。但是,如果我需要多个“ soggiorno”,则会出现以下错误:

  

保存或接受更改失败,因为多个类型的Chameleon2.DB.Addebito'实体具有相同的主键值。

当然,它们具有相同的主键,它们必须具有相同的键,因为每个“ soggiorno”都必须引用相同的外键。我知道通过解决可以得到类似的结果,但是我想了解为什么它不起作用。谢谢!

1 个答案:

答案 0 :(得分:0)

最后我得到了答案。我在这里写,也许对其他人有用。这里的问题不是AddebitoID的重复ID,而是我创建Addebito对象的方式。为了解决该问题,您必须使用两个dbContext:

如果我写过:

    Addebito addebito;
    using (HotelContext context = new HotelContext())
    {
        addebito = context.Addebito.Find(3);
    }

    for (int j = 0; j < 3; j++)
    {
        soggiorno.Addebiti.Add(addebito);
    }

一切都可以正常运行...缺乏经验...