Объект Объект, прикрепленный / не прикрепленный к dbContext

asp.net-mvc c# entity-framework entity-framework-6

Вопрос

У меня есть следующий оператор данных EF:

class Model1{
    public Int32  Id{ get; set; }
    public string Prop1 { get; set; }
    public string Prop2 { get; set; }
    public string Prop3 { get; set; }
    public virtual Model3 PropModel31{ get; set; }
    public virtual Model3 PropModel32{ get; set; }
}
class Model3{
    public Int32  Id{ get; set; }
    public string Prop1 { get; set; }
    public string Prop2 { get; set; }
}

Я прошу мои сущности в разных местах:

//db being the datacontext
//Partial view of Model1
var model1s = from model1 in db.Model1
    select new {
                 model1.Id,
                 model1.Prop1,
                 model1.Prop2,
                 model1.PropModel31,
                 model1.PropModel32,
    };

И, позже, я пытаюсь обновить модельную сущность,

public ActionResult Save(Model1 model1)
{
    db.Model1.Attach(model1);
    var entry = db.Entry(model1);
    entry.Property(e => e.Prop1).IsModified = true;
    entry.Property(e => e.Prop2).IsModified = true;
    ...
    db.SaveChanges();
}

но я получаю следующее исключение:

Объект с тем же ключом уже существует в ObjectStateManager. ObjectStateManager не может отслеживать несколько объектов с одним и тем же ключом.

Если я комментирую db.Model1.Attach (model1); то я получаю противоположное исключение: /

Member 'IsModified' не может быть вызван для свойства 'Prop1', потому что объект типа 'Model1' не существует в контексте. Чтобы добавить объект в контекст, вызовите метод добавления или прикрепления DbSet

Итак, я предполагаю, что свойства объекта Model3 привязаны к контексту, но как это проверить, исправить?

Спасибо за помощь.

Принятый ответ

Ну, исключение инициируется, потому что одно из свойств субобъекта PropModel31 было сброшено на новое (с Id = 0).

Исключение не было явно явным.

Спасибо миллиону Эндрю Графсу за его время и знания!


Популярные ответы

Вам нужен новый экземпляр вашего DbContext:

public ActionResult Save(Model1 model1)
{
    using (var ctx = new MyDbContext())
    {
        ctx.Model1.Attach(model1);
        var entry = ctx.Entry(model1);
        entry.Property(e => e.Prop1).IsModified = true;
        entry.Property(e => e.Prop2).IsModified = true;
        ...
        ctx.SaveChanges();
    }
}



Лицензировано согласно: CC-BY-SA with attribution
Не связан с Stack Overflow
Является ли этот КБ законным? Да, узнайте, почему
Лицензировано согласно: CC-BY-SA with attribution
Не связан с Stack Overflow
Является ли этот КБ законным? Да, узнайте, почему