2013-02-13 104 views
1

我有两个实体 - 产品图片。这个想法是,产品只能有一张照片或没有照片,而且照片可以映射到许多产品。实体框架5.0代码第一对一和一对多关系

public class Product 
{ 
    public int Id {get; set;} 

    public Picture Picture { get; set; } 

    public bool Enabled { get; set; } 

    public string Text { get; set; } 
} 

图片实体是一个包含所有的图片(此图片实体只包含图片为产品的映射)另一图片实体的映射,所以基本上只包含两个与IDS列。

public class Picture 
{ 
    public int Id {get; set;} 

    public int PictureId { get; set; } 
} 

这是产品实体

modelBuilder.Entity<Product>().HasOptional<Picture>(pr => pr.Picture); 

我的模型绑定当我创建一个产品实体图片,或将图片添加到现有的实体Picture_Id列创建于产品表正确填充IdPictur e表。问题是当我尝试检索产品图片实体里面的产品实体为空。我怀疑映射不正确。你能告诉我如何填充图片实体当我检索它时产品实体。下面是检索代码:

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( “图片”),因为它是IQueryable的。 我也启用了延迟加载,但没有结果。

+0

你能发布_productRepository的代码? – 2013-02-13 11:57:20

+1

我相信你已禁用懒惰加载。看到这篇文章,它显示了加载相关数据的多种方式:http://msdn.microsoft.com/en-us/library/vstudio/bb896272(v=vs.100).aspx – 2013-02-13 11:58:49

+0

我启用了延迟加载,但没有效果。 – 2013-02-13 12:43:04

回答

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(); 
    } 
2

你应该使用包括加载相关实体:

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(); 
    } 
} 
+0

我正在使用自定义存储库,因此无法添加.Include(“图片”)或访问GetProductById方法中的ProductContext。请参阅我的帖子的编辑了解更多信息。 – 2013-02-13 12:45:10

+0

我可以只在产品和图片表上使用连接吗? – 2013-02-13 13:02:01

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(); 
} 
相关问题