Я уже несколько дней рвал на себе волосы, и, прежде чем полностью облысеть, пришло время спросить всех, кто умнее меня, как это сделать.
Я использую Entity Framework 4 с кодомПервые CTP 5 и MVC 3.
Сообщение об исключении прямо сейчас: «Объект с тем же ключом уже существует в ObjectStateManager. ObjectStateManager не может отслеживать несколько объектов с одним и тем же ключом.»
Сначала вот контроллер, которому отправляется форма редактирования:
public ActionResult Save(ClientEntity postedClient)
{
try
{
if (ModelState.IsValid)
{
Base.clientInterface.Save(postedClient);
return RedirectToAction("Index");
}
}
catch (Exception)
{
throw;
}
SetupManageData(null, postedClient);
return View("Manage");
}
Метод Save в клиентском интерфейсе таков:
public void Save(ClientEntity theClient)
{
SetContext();
if (theClient.clientId == 0)
this.pContext.Clients.Add(theClient);
else
{
ClientEntity existingClient = GetSingle(theClient.clientId); // Get the existing entity from the data store.
// PseudoCode: Merge existingClient and theClient - Can this be done without using ObjectStateManager?
// PseudoCode: Attach merged entity to context so that SaveChanges will update it in the database - is this correct?
}
this.pContext.SaveChanges();
}
private void SetContext()
{
if (this.pContext == null)
this.pContext = new PersistanceContext();
}
Контекст сопротивления - это DBContext, который выглядит следующим образом:
public class PersistanceContext : DbContext
{
public DbSet<ClientEntity> Clients { get; set; }
}