2015-03-25 4 views
1
public ActionResult Event_History(int id = 0) 
    { 
     //set into false the active flag of the event 
     Events_Info_tbl events = db.Events_Info_tbl.Find(id); 
     events.is_active = false; 
     db.Entry(events).State = EntityState.Modified; 

     //set the category under this event into inactive 
     List<Events_Category_tbl> category = new List<Events_Category_tbl>(); 
     category = db.Events_Category_tbl.Where(x=>x.events_info_id==id).ToList();   
     foreach(var i in category){ 
      Events_Category_tbl cat = new Events_Category_tbl(); 
      cat.is_active = false; 
      db.Entry(cat).State = EntityState.Modified; 
     } 

     db.SaveChanges(); 

     TempData["MessageAlert"] = "Event is save in history!"; 

     return RedirectToAction("Index"); 


    } 

Iam, планирующий установить в неактивную категорию, принадлежит к этому конкретному событию, но когда я пытаюсь запустить этот код, отображается ошибка «Объект с тем же ключом уже существует в ObjectStateManager. ObjectStateManager не может отслеживать несколько объектов с одним и тем же ключом ». указывая на эту часть моего кода db.Entry(cat).State = EntityState.Modified;Обновить список данных в базе данных

+0

Вам не нужно менять состояние вручную, это ручка EF – Peyman

ответ

0

Ниже кода пытаются создать новый объект и сохранить в БД, и все новый объект имеет тот же идентификатор, именно поэтому дать эту ошибку:

Events_Category_tbl cat = new Events_Category_tbl(); 
cat.is_active = false; 
db.Entry(cat).State = EntityState.Modified; 

Вам не нужно создавать новый объект, просто обновить извлеченный объект:

public ActionResult Event_History(int id = 0) 
{ 
    //set into false the active flag of the event 
    var events = db.Events_Info_tbl.Find(id); 
    events.is_active = false;   

    //set the category under this event into inactive 
    var category = db.Events_Category_tbl.Where(x=>x.events_info_id==id).ToList();   
    foreach(var cat in category){ 
     cat.is_active = false; 
    } 

    db.SaveChanges(); 

    TempData["MessageAlert"] = "Event is save in history!"; 

    return RedirectToAction("Index"); 


} 
0
 foreach(var i in category){ 
     Events_Category_tbl cat = new Events_Category_tbl(); 
     cat.is_active = false; 
     db.Entry(cat).State = EntityState.Modified; 
    } 

Эта часть не имеет никакого смысла. Вы не должны создавать новый экземпляр Events_Category_tbl.

Вы должны вместо этого просто

foreach(var i in category){ 
     i.is_active = false; 
    } 
0

категории в таблице могут повторяться .... пожалуйста замените:

db.Events_Category_tbl.Where(x=>x.events_info_id==id).ToList() 

с

db.Events_Category_tbl.Where(x=>x.events_info_id==id).Distinct().ToList() 

Таким образом, вы УБЕДИТЕСЬ ЧТО КАЖДЫЙ ПУНКТ ПОВТОРЯЕТ ТОЛЬКО ОДИН