EF: MVC: ASP: ошибка TPH - сохранить обновление, вставить или удалить ... количество строк (0).Объекты ... изменены или удалены ... Обновить ObjectStateManager - PullRequest
1 голос
/ 17 октября 2011

Сообщение об ошибке: «Оператор хранения, вставки или удаления затронул неожиданное количество строк (0). Возможно, объекты были изменены или удалены с момента загрузки объектов. Обновите записи ObjectStateManager.»

Привет всем,

Я создал TPH Code First (Table Per Hierarchy) в MVC и EF с компактной базой данных SQL.

Вот диаграмма классов / Иерархия:

Диаграмма классов

Client и SalesRep оба наследуют класс BaseUser. Ключом является «ID пользователя», и он закодирован с аннотацией данных [Key] (я знаю, что «ID» должен также установить его)

Вот где я нахожусь: я могу заполнить базу данных несколькими записями. Когда я пытаюсь установить "UserID" в методе заполнения, он, кажется, игнорирует его и просто применяет UserID в числовом порядке ... (мне кажется, нормально?)

Более того, вот мой DbContext

public class SiteDB:DbContext
{
    public DbSet<BaseUser> AllUsers { get; set; }//enable TPH
    public DbSet<SalesRep> SalesReps { get; set; }
    public DbSet<Client> Clients { get; set; }
}

Далее

Я создал контроллер для клиентов -> ClientsController со строго типизированными представлениями Razor. С этим. Теперь у меня есть CRUD для клиентов. Я могу создавать новых клиентов без каких-либо проблем, но когда я пытаюсь редактировать запись клиента, я получаю сообщение об ошибке, указанное выше.

Я заметил кое-что интересное. Я прошел по коду, и ошибка произошла в db.SaveChanges ();

Когда клиент возвращается обратно в метод ActionResult Edit, UserID = 0! Bizarre? Я не уверен, является ли это ошибкой или фактической проблемой, которая вызывает это.

UserID = 0

Ваша помощь в этом приветствуется. Спасибо!

1 Ответ

0 голосов
/ 17 октября 2011

Чтобы изменить сущность, вам нужно получить ее из базы данных: когда вы возвращаете измененные значения в действии Edit, вам нужно извлечь сущность из объекта db, получив ее по ID, применить измененные значения и сохранить его.

Вот пример:

public ActionResult Edit(int id, MyModel model){
 using (SiteDBdb = new SiteDB()){
  Client cl = (from c in db.Clients where c.id == id select c).First();
  cl.MyProp = model.MyProp;
  ...
  db.SaveChanges();
 }
 ...
}
...