我有两个实体:
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; }
}
我应该如何加载所需的字段?
由于
答案 0 :(得分:2)
也许你的映射定义有问题。你能在你的分类表上做一个GetAll吗?您的Product.Category属性是否知道要用于Category表的外键?
文章Using DbContext in EF 4.1 Part 6: Loading Related Entities解释了以急切或懒惰模式加载实体的不同方法。
当您使用context.Configuration.LazyLoadingEnabled = false
时,您正在定义加载实体的全局方式,但如果您愿意,您可以通过执行以下操作具体说明应如何加载每个属性:
public virtual Category Category { get; set; }
public Category Category { get; set; }
因此,如果它不起作用,我会检查您的映射定义,然后检查发送到您的数据库的SQL查询。您将确切地看到sql查询是否包含您的类别详细信息。
我知道2个选项可以看到生成的sql。您可以监控数据库或使用Mvc Mini Profiler。如果您使用的是DevArt dotConnect,那么您就拥有了一个监控工具。
答案 1 :(得分:2)
我刚尝试以这样的方式获取Product对象:
Product product = (
from p in repository.Products.Include("Category")
where p.ProductID == id
select p
).SingleOrDefault();
和类别也已加载。这是可能的解决方案。但有趣的是,当我使用第一个
时,为什么类别为空