Entity Framework ленивая загрузка - PullRequest
       5

Entity Framework ленивая загрузка

2 голосов
/ 18 сентября 2011

У меня есть две сущности:

public class Product
    {
        [HiddenInput(DisplayValue=false)]
        public int ProductID { get; set; }

        [Required(ErrorMessage="Please enter a product name")]
        public string Name { get; set; }

        [Required(ErrorMessage = "Please enter a description")]
        [DataType(DataType.MultilineText)]
        public string Description { get; set; }

        [Required]
        [Range(0.01,double.MaxValue,ErrorMessage="Please enter positive price")]
        public decimal Price { get; set; }

        public Category Category { get; set; }

        [HiddenInput(DisplayValue= false)]
        public string ImageFileName { get; set; }

        [HiddenInput(DisplayValue = false)]
        public string ImageMimeType { get; set; }

    }

и

public class Category
    {
        [HiddenInput(DisplayValue=false)]
        public int CategoryID { get; set; }

        [Required(ErrorMessage="Please enter a category name")]
        public string Name { get; set; }

        [Required(ErrorMessage = "Please enter a description")]
        [DataType(DataType.MultilineText)]
        public string Description { get; set; }


        public ICollection<Product> Products { get; set; }

        [HiddenInput(DisplayValue= false)]
        public string ImageFileName { get; set; }

        [HiddenInput(DisplayValue = false)]
        public string ImageMimeType { get; set; }
    }

Когда я пытаюсь получить продукт таким образом

Product product = repository.Products.FirstOrDefault(p => p.ProductID == id);

Поле категории равно нулю.

Нет методов product.Category.Load () и repository.Products.Include ("Category") ....

context.Configuration.LazyLoadingEnabled = false;

не влияет. Контекст является объектом следующего класса

 public class EFDbContext:DbContext 
    {
        public DbSet<Product> Products { get; set; }
        public DbSet<Category> Categories { get; set; }
    }

Как загрузить нужное поле?

Спасибо

Ответы [ 2 ]

2 голосов
/ 19 сентября 2011

Я только что попытался получить объект Product следующим образом:

Product product = (
   from p in repository.Products.Include("Category") 
   where p.ProductID == id 
   select p
).SingleOrDefault(); 

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

2 голосов
/ 18 сентября 2011

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

Статья Использование DbContext в EF 4.1 Часть 6: Загрузка связанных сущностей объясняет различные способы загрузки ваших сущностей в нетерпеливом или ленивом режиме.

Когда вы используете context.Configuration.LazyLoadingEnabled = false, вы определяете глобальный способ для загрузки сущностей, но если вы хотите, вы можете указать, как каждое свойство должно быть загружено, выполнив это:

  • Пример для Ленивый Загрузка: public virtual Category Category { get; set; }
  • Пример для Стремление Загрузка: public Category Category { get; set; }

Так что, если он не работает для вас, я бы проверил ваше определение сопоставления, а затем проверил SQL-запрос, отправленный в вашу базу данных. Вы точно увидите, включает ли SQL-запрос информацию о вашей категории или нет.

Я знаю 2 варианта просмотра sql, который генерируется. Вы можете контролировать свою базу данных или использовать Mvc Mini Profiler . Если вы используете DevArt dotConnect, у вас есть для этого инструмент мониторинга.

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