2012-06-18 3 views
1

У меня проблема с обновлением моей БД с использованием Linq для сущностей.Linq для объектов: обновление создает новую строку

У меня есть 2 объекта: Сообщение и автор Мое приложение проверяет веб-сервис и вытягивает сообщения и авторов из службы.

В моей базе данных уже существует сообщение и автор, поэтому я проверяю дубликаты.

Это хорошо работает для автора. Новые авторы добавляются, существующие обновляются.

Однако сообщения дают мне странную проблему. Сообщение имеет очевидное отношение к автору, поэтому я добавляю автора в мое сообщение, вызывая Message.Author = Author; , где автор - новый или обновленный автор моего предыдущего шага.

По-видимому, как только я это сделаю, а позже в моем коде, отправьте изменения, сущность framework/linq решит добавить это новое сообщение в БД, даже без моего вызова объекта упоминания. Вероятно, это связано с тем, что автор связан с ним.

Может ли кто-нибудь дать мне правильный способ в псевдокоде или что-то вставить/обновить как автора, так и сообщение, используя Linq для сущностей?

ответ

1

EF всегда обрабатывает все объекты в графе объектов. Если у вас есть Author, связанный с контекстом EF, и вы назначаете экземпляр этого автора для отдельного экземпляра Message, EF обнаружит это как новый объект в графе объектов. Вы должны сказать EF, что сущность не нова, а существующая, изменив ее состояние.

if (IsNewAuthor(author)) { 
    context.Add(author); 
} else { 
    context.Attach(author); 
    context.ObjectStateManager.ChangeObjectState(author, EntityState.Modified); 
} 

message.Author = author; 
context.ObjectStateManager.ChangeObjectState(message, EntityState.Unchanged); 
context.SaveChanges(); 
+0

Таким образом, EntityState.Unchanged для сообщения сообщает EF, что сообщение не было изменено, поэтому EF не увидит его как новый объект? И после этого кодового блока я проверяю, существует ли мое сообщение и выполняет ли вставка/обновление для самого сообщения? – Ron83

+0

Этот блок кода ожидает, что сообщение существует в вашей базе данных, и оно не было изменено. Если вам нужно добавить или обновить его, вы будете использовать аналогичный блок, как для автора. –

+0

К сожалению, приведенное выше решение генерирует следующую ошибку в строке EntityState.Unchanged: Заявление об обновлении, вставке или удалении Store повлияло на неожиданное количество строк (0). Объекты могут быть изменены или удалены, поскольку объекты загружены. Обновить записи ObjectStateManager. – Ron83

Смежные вопросы