ASP.NET EF4: добавление дублированных ссылочных объектов - PullRequest
0 голосов
/ 08 августа 2011

У меня есть новый объект Entity Framework 4, который ссылается на другой объект, простую запись пользователя.В моих входных данных у меня может быть несколько экземпляров пользовательских записей одного и того же человека.Этот человек может не существовать в базе данных;если нет, мне нужно добавить их, создав новую сущность пользователя и добавив их.

Поэтому, когда я создаю основную сущность, которая ссылается на пользователя, я делаю быстрый поиск этого пользователя в базе данных.Если этот человек существует, отлично, я получил ссылку на сет.Если нет, я создаю новую запись пользователя и устанавливаю ссылку в основной сущности на вновь созданную сущность пользователя.Когда я обрабатываю больше записей, может появиться один и тот же пользователь, поэтому, когда я делаю запрос в функции «создать нового пользователя», я предполагал, что если существует только что созданная, но еще не сохраненная сущность, запрос найдет эту запись,но, видимо, нет (хорошо, может быть, глупое предположение) ... поэтому конечный результат заключается в том, что для этого пользователя создается дублирующая запись, связанная с новым основным объектом, и когда все это сохраняется, я получаю сообщение «Ошибка SQL 2601: Невозможновставить строку дубликата ключа в объект 'dbo.user_table' с уникальным индексом 'IX_user_table'. "ошибка.

Так что я немного озадачен, как решить эту ситуацию.Проблема в том, что я не могу вызвать SaveChanges () для контекста сразу после добавления новой пользовательской сущности, потому что это приводит к сохранению всего графа сущностей, а основная сущность, которая ссылается на записи пользователя, еще не завершена, этоне готов сохранить, поэтому я не могу сохранить весь беспорядок каждый раз, когда добавляю нового пользователя.Мне нужно создать все сущности, а затем сохранить все за один раз.

Нужно ли делать два запроса каждый раз, когда я ищу пользователя, один в базе данных и один что-то вроде:

var unsavedVisitors = from c in
  dataContext.ObjectStateManager.GetObjectStateEntries(System.Data.EntityState.Added)
  where c.Entity is my_table
  select c.Entity;

Я действительно не возился с внутренностями менеджера состояния сущности, поэтому я не уверен, что здесь делать - как я могу сделать запрос, чтобы найти существующую, но не сохраненную сущность пользователя, которую я мог бы затем просто связатьк новым основным объектам, которые я создаю, когда я перебираю свои входные данные?Похоже, что я могу просто привести c.Entity выше к типу my_table и wala, у меня есть ссылка.Хотелось бы, чтобы был какой-то трюк «включить несохраненные сущности в мой запрос» или что-то подобное, чтобы избежать обхода всех несохраненных сущностей с таким количеством запросов - не так ли?

1 Ответ

1 голос
/ 08 августа 2011

Нет, трюка "включить несохраненные сущности в мой запрос" нет.Это правильный способ проверить записи в ObjectStateManager.В качестве альтернативы вы можете управлять новыми добавленными пользователями в некотором пользовательском словаре, но это в основном то же самое, что и использование ObjectStateManager.Последний вариант - сначала очистить вашу коллекцию пользователей от дубликатов объектов.

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