繁体   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