EF4.1, POCOS, Динамические Прокси и Коллекции - PullRequest
1 голос
/ 25 ноября 2011

Есть ли какая-то особая причина, по которой добавление элемента в коллекцию EF4.1, сохранение его в базе данных и последующий выбор этой коллекции приведет к странным результатам?

Когда я делаю начальную загрузку, все элементы в коллекции имеют тип System.Data.Entity.DynamicProxies.MyClassName_LongString, поэтому в коллекции работает следующее:

var y = MyCollection.Where(x => x.ValidTo == null).First();

Да, в коллекции всегда есть предмет, который соответствует этим критериям. Всегда.

Однако, если я выбираю коллекцию, добавляю в нее новый элемент, сохраняю изменения и затем снова выбираю коллекцию в том же контексте, последний элемент в коллекции (новый) не является динамическим прокси, но вместо этого мой тип POCO (Moo.Model.MyClassName).

Выполнение того же выбора сверху на , что * версия 1013 * коллекции выдает исключение нулевой ссылки - даже если последний элемент (нединамический прокси) действительно соответствует критериям, которые у меня есть подтверждено просмотром коллекции вручную ...

Загрузите коллекцию из другого контекста после изменений, и поведение не будет отображаться само по себе - все они являются динамическими прокси-серверами, и выбор работает.

Кто-нибудь имеет представление о причинах такого поведения?

1 Ответ

1 голос
/ 26 ноября 2011

Однако, если я выберу коллекцию, добавлю в нее новый элемент, сохраню изменения и затем в том же контексте выберите коллекцию снова, последний элемент в коллекции (новый), не является динамическим прокси, но вместо этого мой тип POCO (Moo.Model.MyClassName).

Если вы создаете новый элемент с оператором new, он не является прокси. И он не станет прокси, когда вы запросите его с тем же контекстом, потому что Entity Framework проверяет, существует ли уже объект с тем же ключом, присоединенным к контексту объекта, и если да, он не создает новый (прокси) объект , Итак, ваша новая сущность будет тем же объектом, который не является прокси.

Если вы работаете таким образом, вы должны сначала создать сущность в качестве прокси, что означает, что вы не используете оператор new, а вместо этого Create метод DbSet<T>:

var newEntity = dbContext.Entities.Create();

Теперь newEntity - это прокси, как и другие сущности, которые у вас уже есть в вашей коллекции.

Я не знаю, почему вы получаете исключение, которое вы описали (которое может иметь отношение к соединению прокси и непрокси объектов в одной коллекции), но надеюсь, что оно исчезнет, ​​когда вы используете Create метод вместо new.

...