Первый класс автоматического прокси-класса aut gen и свойства коллекции null

Для всех моих POCOs свойства навигации и коллекции имеют нулевое значение.

Позвольте мне привести некоторые предпосылки. У меня есть сложный код первого проекта с использованием EF 4.3.1. Генерация прокси-сервера была отключена. Свойства коллекции и навигации управлялись вручную.

Теперь я разрешаю создание прокси и ленивую загрузку. При отладке я вижу, что мой объект (который передается моему известному типу POCO) теперь фактически является автоматически созданным прокси-классом. Все идет нормально.

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

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

Все свойства навигации и сбора являются виртуальными. например:

public virtual NavigationType NavigationName { get; set; }
public virtual ICollection<CollectionType> CollectionName { get; set; }

Кроме того, все таблицы инициализируются как таковые:

modelBuilder.Entity<TEntity>()
.Map(m =>
{
    m.MapInheritedProperties();
    m.ToTable("TableName");
});

Я также могу подтвердить, что база данных генерируется так, как ожидалось. Все внешние ключи присутствуют и связаны с ожидаемыми полями.

Почему они ноль? Как я могу диагностировать это дальше?

Ответ 1

Как я могу диагностировать это дальше?

Вы можете проверить, например, если объекты, которые вы проверяете, привязаны к контексту, просмотрев коллекцию отслеживания изменений context.ChangeTracker.Entries().

Хорошо, что у вас есть динамический прокси-сервер со всеми свойствами навигации null, например:

Entity entity = context.Entities.Create();

entity будет прокси, но NavigationName и CollectionName будут null, и они останутся null, даже когда вы получите доступ к этим свойствам (что приведет к NullReferenceException s). Это изменится только при добавлении объекта:

context.Entities.Attach(entity);

Если вы получаете доступ к свойствам, теперь должна выполняться ленивая загрузка. NavigationName может оставаться null, если в базе данных нет связанной сущности, но коллекция CollectionName никогда не должна быть null после присоединения и доступа к ней. Если в базе данных нет связанных объектов, результат должен быть пустой, но не null.