我有两个实体 - 产品和图片。这个想法是产品只能有一张图片或者没有图片,而且图片可以映射到许多产品。
public class Product
{
public int Id {get; set;}
public Picture Picture { get; set; }
public bool Enabled { get; set; }
public string Text { get; set; }
}
图片实体是另一个图片实体的映射,其中包含所有图片(此图片实体仅包含产品图片的映射),因此基本上它只包含两列的ID。
public class Picture
{
public int Id {get; set;}
public int PictureId { get; set; }
}
这是产品实体的模型绑定器
modelBuilder.Entity<Product>().HasOptional<Picture>(pr => pr.Picture);
当我使用图片创建产品实体,或者将图片添加到现有实体时,产品中创建的 Picture_Id 列表格使用图片表格中的 ID 正确填充。问题是当我尝试检索产品时。 产品实体中的图片实体为空。我怀疑映射是不正确的。您能否告诉我在检索产品实体时如何填充图片实体。这是检索代码:
public Product GetProductById(int productId)
{
var query = from pr in _productRepository.Table
where pr.Id == productId
select pr;
return query.FirstOrDefault();
}
编辑我正在使用自定义 IRepository 服务,我包含了依赖注入
IRepository<Product>
IRepository 界面包含以下方法:
void Insert(T entity);
void Update(T entity);
void Delete(T entity);
IQueryable<T> Table { get; }
这是表:
的实现 public virtual IQueryable<T> Table
{
get
{
return this.Entities;
}
}
private IDbSet<T> Entities
{
get
{
if (_entities == null)
_entities = _context.Set<T>();
return _entities;
}
}
我无法将 .Include(“Picture”)添加到表格,因为它是 IQueryable 。 我也启用了延迟加载,但没有结果。
答案 0 :(得分:2)
var products = db.Pictures.Include("Product");
public Product GetProductById(int productId)
{
var query = from pr in products
where pr.Id == productId
select pr;
return query.FirstOrDefault();
}
答案 1 :(得分:2)
你应该使用include来加载相关的实体:
public Product GetProductById(int productId)
{
using (var db = new ProductContext())
{
var query = from pr in db.Products.Include("Picture")
where pr.Id == productId
select pr;
return query.FirstOrDefault();
}
}
答案 2 :(得分:0)
我解决了这个问题。不确定这是否是正确的方法,但它确实有效。
我做了以下更改:
public class Product
{
public int? PictureId { get; set; }
public int Id {get; set;}
public Picture Picture { get; set; }
public bool Enabled { get; set; }
public string Text { get; set; }
}
modelBuilder.Entity<Product>().HasOptional<Picture>(pr => pr.Picture).WithMany().HasForeignKey(pr => pr .PictureId);
public Product GetProductById(int productId)
{
var query = from pr in _productRepository.Table
where pr.Id == productId
select pr;
var product = query.FirstOrDefault();
AddProductPicture(product);
return product;
}
private void AddProductPicture(Product product)
{
var query = from pic in _pictureRepository.Table
where pic.Id == product.PictureId
select pic;
product.Picture = query.FirstOrDefault();
}