【问题标题】:Entity Framework 5.0 code first one to one and one to many relationshipEntity Framework 5.0 代码优先一对一和一对多关系
【发布时间】:2013-02-13 23:11:43
【问题描述】:

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

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 实体只包含产品图片的映射),所以基本上它只包含两列身份证。

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_IdPicture 表格中的 Id 已正确填充表格。问题是当我尝试检索 Product 时。 Product 实体中的 Picture 实体为空。我怀疑映射不正确。您能告诉我在检索 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; }

这是Table的实现:

 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") 添加到 Table,因为它是 IQueryable。 我也启用了延迟加载,但没有结果。

【问题讨论】:

  • 能把_productRepository的代码贴出来吗?
  • 我相信您禁用了延迟加载。看这篇文章,它向您展示了加载相关数据的不同方式:msdn.microsoft.com/en-us/library/vstudio/…
  • 我开启了延迟加载,但没有任何效果。

标签: c# entity-framework asp.net-mvc-4 entity-framework-5


【解决方案1】:
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】:

    您应该使用 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();
        }
    }
    

    【讨论】:

    • 我使用的是自定义存储库,因此无法在 GetProductById 方法中添加 .Include("Picture") 或访问 ProductContext。请参阅我的帖子的编辑了解更多信息。
    • 我可以只在 Product 和 Picture 表上使用 join 吗?
    【解决方案3】:

    我解决了这个问题。不确定这是否是正确的方法,但它有效。

    我做了以下更改:

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

    【讨论】:

      猜你喜欢
      • 2014-08-12
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-01-01
      • 2015-07-23
      • 2015-08-08
      相关资源
      最近更新 更多