Я занимаюсь разработкой веб-приложения ASP.Net MVC 3 с использованием Entity Framework 4.1, однако у меня возникла проблема с обновлением навигационной сущности объекта.
У меня есть сущность с именем Shift
public partial class Shift
{
public Shift()
{
this.Locations = new HashSet<ShiftLocation>();
}
public int shiftID { get; set; }
public string shiftTitle { get; set; }
public virtual ICollection<ShiftLocation> Locations { get; set; }
}
В моем контроллере сдвига у меня есть два метода HttpPost для создания и редактирования сдвига.
[HttpPost]
public ActionResult CreateShift(ViewModelShift model)
{
if (ModelState.IsValid)
{
Shift shift = new Shift();
shift = Mapper.Map<ViewModelShift, Shift>(model);
//Create new shift location and add it to the newly created Shift
ShiftLocation location = new ShiftLocation();
location.locationID = model.locationID;
shift.Locations.Add(location);
_shiftService.AddShift(shift);
return RedirectToAction("Index");
}
}
[HttpPost]
public ActionResult EditShift(ViewModelShift model)
{
if (ModelState.IsValid)
{
Shift shift = new Shift();
shift = Mapper.Map<ViewModelShift, Shift>(model);
ShiftLocation location = new ShiftLocation();
//location = Mapper.Map<ViewModelShift, ShiftLocation>(model);
location.shiftID = model.shiftID;
location.locationID = model.locationID;
shift.Locations.Add(location);
_shiftService.UpdateShift(shift);
return RedirectToAction("Index");
}
}
Метод CreateShift работает нормально, т.е. вставляет запись в базу данных для нового Shift, а также новую запись для Shift Location в другой таблице. Однако метод EditShift обновляет только запись Shift, но не обновляет запись местоположения Shift, даже если я назначил shiftID и новый locationID.
Любая информация о том, как это исправить, будет очень признательна.
Спасибо.
EDIT
Мой класс ShiftLocation выглядит следующим образом
public partial class ShiftLocation
{
public int shiftLocationID { get; set; }
public int shiftID { get; set; }
public int locationID { get; set; }
public virtual Shift Shift { get; set; }
}
Метод UpdateShift в классе ShiftService выглядит следующим образом
public void UpdateShift(Shift item)
{
_UoW.Shifts.Update(item);
_UoW.Commit();
}
И тогда вызывается метод Update в моем универсальном репозитории
public void Update(TEntity entityToUpdate)
{
dbSet.Attach(entityToUpdate);
context.Entry(entityToUpdate).State = EntityState.Modified;
}
2-е редактирование
Исходя из ответа Слаумы, я отредактировал свое действие PostShift Post на следующее
if (ModelState.IsValid)
{
//Shift shift = new Shift();
Shift shift = _shiftService.GetShiftByID(model.shiftID);
ShiftLocation shiftLocation = shift.Locations.Where(s => s.shiftID == model.shiftID).Single();
shift = Mapper.Map<ViewModelShift, Shift>(model);
shiftLocation.locationID = model.locationID;
shift.Locations.Add(shiftLocation);
_shiftService.UpdateShift(shift);
return RedirectToAction("Index");
}
Моя проблема сейчас заключается в том, что при вызове метода обновления в моем общем репозитории возникает следующая ошибка
An object with the same key already exists in the ObjectStateManager.
The ObjectStateManager cannot track multiple objects with the same key
Теперь, я теперь понимаю, почему это происходит, потому что в моем действии EditPost я получаю экземпляр Shift, а затем в методе обновления в общем репозитории я пытаюсь присоединить тот же Shift.
Сейчас я просто запутался. Мой универсальный репозиторий выглядит нормально, так как я скопировал его из учебника Microsoft MVC, упомянутого в начале этого поста.
Опять же, любая помощь в том, как заставить работать это простое обновление, была бы очень признательна.