произошла ошибка при обновлении контекста объекта - PullRequest
6 голосов
/ 14 апреля 2011

в первую очередь вот это сообщение

Изменения в базе данных были совершено успешно, но ошибка произошло при обновлении объекта контекст. ObjectContext может быть в противоречивое состояние. Внутреннее исключение сообщение: ссылочная целостность нарушение ограничения произошло: значения свойств, которые определяют ссылочные ограничения не соответствует между основной и зависимые объекты в отношениях.

проблема возникает, когда я пытаюсь вставить новые данные в рамку объекта


Моя модель сущности

enter image description here

в базе данных я установил отношение к каскаду при удалении и обновлении. это единственное изменение, которое я сделал в отношении


Метод моего действия:

[HttpPost]
    public ActionResult CompleteRegisteration(RegisterViewModel model)
    {
        if (!ModelState.IsValid)
        {
            return View(model);
        }
        var user = new User
                       {
                           DisplayName = model.DisplayName,
                           FullName = model.Name,
                           Email = model.Email,
                       };
        user.AuthenticationTokens.Add(new AuthenticationToken
                                          {
                                              ClaimedIdentifier = model.ClaimedIdentifier,
                                              DisplayName = model.Email
                                          });
        _userRepository.InsertOrUpdate(user);
        _userRepository.Save();

        return RedirectToAction("Index", "Home");
    }

и методы пользовательского репозитория:

    private readonly StoryWritingEntities context = new StoryWritingEntities();

    public void InsertOrUpdate(User user)
    {
        context.Users.Attach(user);
        context.ObjectStateManager.ChangeObjectState(user,
                                                     user.Id == default(int)
                                                         ? EntityState.Added // if true then this is a new entry
                                                         : EntityState.Modified); // if false this is an Existing entry

    }
    public void Save()
    {
        context.SaveChanges();
    }

проблема вызвана context.SaveChanges() в таблицу пользователей вставлена ​​запись, но в таблицу AuthenticationTokens ничего не вставлено

Ответы [ 4 ]

6 голосов
/ 14 апреля 2011

Если бы вы просто сделали следующее, этого бы не случилось:

  context.Users.AddObject(user);
  content.SaveChanges();

Я подозреваю, что проблема возникает, потому что EF не знает об объекте AuthenticationToken, он не присоединяется к контексту, потому что он добавляется к отключенной сущности, которая затем присоединяется к контексту.

Вам нужно либо разрешить EF обрабатывать всю ситуацию с подключением графов объектов, либо вам нужно сделать все это самостоятельно. Подобное микширование и сопоставление не работает.

1 голос
/ 14 апреля 2011

Попробуйте что-то другое, например:

if(model.Id != null)
{
    UpdateModel(user);
}
else
{
    _userRepository.Insert(model)
}
_userRepository.Save();

И _userRepository.Insert будет:

public void Insert(User user)
{
    context.Users.AddObject(user);
}
0 голосов
/ 12 мая 2016

Я получил эту ошибку, потому что пытался редактировать таблицу, но код добавлял строку с тем же идентификатором.

Так что я просто изменил

ctx.table.Add(entity object);

тоже

ctx.Entry(entity object).State = EntityState.Modified;
0 голосов
/ 14 апреля 2011

в базе данных я устанавливаю отношение к каскаду при удалении и обновлении

1) Я считаю, что если вы устанавливаете каскадное удаление непосредственно в базе данных, вам также необходимо определить его вмодель.Настройки в конструкторе модели находятся в окне свойств соответствующей ассоциации (нажмите на линию ассоциации между двумя объектами на поверхности конструктора, затем выберите «Свойства»).

2) Я также считаю, что каскадобновление не поддерживается в EF.Попробуйте удалить каскад при обновлении в базе данных и проверьте, работает ли он тогда.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...