У меня есть простая модель связующий:Как использовать ModelBinders с DbContext, хранящимся в OwinContext?
public class PersonBinder : IModelBinder
{
public object BindModel(ControllerContext controllerContext, ModelBindingContext bindingContext)
{
// ...
// id = routevalues[ id ]
var db = controllerContext.HttpContext.GetOwinContext().Get<ApplicationDbContext>();
return db.Set<Person>().FirstOrDefault(o => o.Id == id);
}
}
И это прекрасно работает. Вот к примеру:
public ActionResult Edit(Person entity, int? id)
{
if (entity == null && id.HasValue)
throw new HttpException(404, "Person not found.");
return View(person);
}
Вопрос в том, когда я пытаюсь сохранить его в базе данных:
// DbContext = HttpContext.GetOwinContext().Get<ApplicationDbContext>()
[HttpPost]
public async Task<ActionResult> Edit(Person entity, int? id)
{
if (entity == null && id.HasValue)
throw new HttpException(404, "Person not found.");
if (ModelState.IsValid)
{
// WORKS when inserting a new person to the database
if (!id.HasValue)
DbContext.People.Add(entity);
else
{
// if I try to attach I get an error: see bellow
// if I don't attach, it does nothing
}
await DbContext.SaveChangesAsync();
}
return View(entity);
}
Ошибка на прикрепиться:
System.InvalidOperationException: Прикрепление объект типа '..Person' не удалось, поскольку другой объект того же типа уже имеет одно и то же значение первичного ключа. Это может произойти при использовании метода «Прикрепить» или установки состояния объекта в «Без изменений» или «Модифицировано», если любые объекты на графике имеют конфликтующие значения ключей. Это может быть связано с тем, что некоторые объекты являются новыми и еще не получили значения ключей базы данных. В этом случае используйте метод «Добавить» или «Добавленное» состояние объекта для отслеживания графика, а затем, если необходимо, установите состояние не новых объектов «Без изменений» или «Модифицировано».
статус предприятие показывает, как Detached
, когда я запускаю это в действии контроллера:
DbContext.Entry(entity).State
Почему это происходит? Как я могу это исправить? Невозможно ли использовать для этого связующие?
Проблема в том, что ваши DbContexts - это два разных экземпляра. Как вы получаете объект DbContext в OWIN и как его получить в контроллере? – trailmax