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

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

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() и репозитория.Products.Include("Category")....

context.Configuration.LazyLoadingEnabled = false;

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

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

Как я должен загрузить необходимое поле?

Спасибо


person xwrs    schedule 18.09.2011    source источник
comment
Я только что попытался получить объект Product таким образом: Product product = (из p в репозитории.Products.Include(Category), где p.ProductID == id select p).SingleOrDefault(); и категория тоже была загружена. Это возможное решение. Но интересно, почему категория нулевая, когда я использую первый способ   -  person xwrs    schedule 18.09.2011


Ответы (2)


Возможно, у вас есть проблема с определением сопоставления. Можете ли вы сделать 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, у вас есть инструмент мониторинга именно для этого.

person Alexandre Jobin    schedule 18.09.2011

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

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

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

person xwrs    schedule 19.09.2011