2013-02-13 98 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(); 
} 
相關問題