簡體   English   中英

Entity Framework 5.0代碼首先是一對一和一對多的關系

[英]Entity Framework 5.0 code first one to one and one to many relationship

我有兩個實體 - 產品圖片 這個想法是產品只能有一張圖片或者沒有圖片,而且圖片可以映射到許多產品。

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; }
}

這是我的Product實體的模型綁定器

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

當我創建帶有圖片的Product實體,或者將圖片添加到現有實體時,在Product表中創建的Picture_Id列使用Picture表中的Id正確填充。 問題是當我嘗試檢索產品時 Product實體內的Picture實體為null。 我懷疑映射是不正確的。 你能告訴我如何在檢索它時在Product實體中填充Picture實體。 這是檢索代碼:

 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 我也啟用了延遲加載,但沒有結果。

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

你應該使用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();
    }
}

我解決了這個問題。 不確定這是否是正確的方法,但它確實有效。

我做了以下更改:

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM