2014-01-24 1 views
2

я следующее заявление EF данные:Entity Object прилагается/не прилагается к DbContext

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' не существует в контексте. Чтобы добавить объект в контекстный вызов, добавьте метод Add или Attach для DbSet

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

Благодарим за помощь.

+0

так почему именно вы отключите отслеживание изменений, а затем ожидаете, что контекст будет отслеживать изменения в любом случае? – Claies

+0

Извините, не уверен насчет вашего вопроса? Скажем, я не хочу отслеживать, как я могу сохранить свою сущность в db? – Yoann

+0

Это точка отслеживания, так что контекст знает, что было изменено в модели по сравнению с базой данных. использование AsNoTracking в основном приводит к тому, что контекст не отслеживает, поэтому, когда вы меняете объект и затем пытаетесь сохранить его, у вас есть конфликт, как будто вы добавляете новую запись в конфликт с существующим элементом базы данных. – Claies

ответ

3

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

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

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

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(); 
    } 
} 
+0

То же самое проблема к сожалению. – Yoann