实体框架5.0代码首先是一对一和一对多关系

本文关键字:一对一 一对多 关系 框架 代码 实体 | 更新日期: 2023-09-27 17:58:52

我有两个实体-产品图片。这个想法是,一个产品可以只有一张图片,也可以没有图片,一张图片可以映射到许多产品。

public class Product
{
    public int Id {get; set;}
    public Picture Picture { get; set; }
    public bool Enabled { get; set; }
    public string Text { get; set; }
}

Picture实体是到另一个包含所有图片的Pictures实体的映射(此Picture实体只包含产品图片的映射),因此基本上它只包含两列ID。

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

这是我的产品实体的模型活页夹

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

当我创建带有图片的Product实体,或将图片添加到现有实体时,Products表中创建的picture_Id列将正确填充picture表格中的1d品时。产品实体内的图片主体为空。我怀疑映射不正确。当我检索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;
        }
    }

我无法添加。包括("图片"),因为它是可查询的。我还启用了懒惰加载,但没有结果。

实体框架5.0代码首先是一对一和一对多关系

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