【问题标题】:Entity Framework not returning related objects实体框架不返回相关对象
【发布时间】:2016-11-16 22:07:39
【问题描述】:

所以我试图将 2 个表相互关联。我有一个产品表和一个图像表。我在产品对象中有一个图像集合,在图像对象/表中有一个产品 ID,但是当它获取产品对象时,图像集合是空的。

现在有趣的是,在调试时,如果我在产品对象从中提取信息之前检查上下文元素,它会将图像加载到上下文元素中,然后将其分配给产品。所以它只有在我手动检查上下文元素并搜索图像时才有效。

产品

public class Product
    {
        public int Id { get; set; }
        public string FriendlyUrl { get; set; }
        public string Title { get; set; }
        public string Description { get; set; }
        public double? Price { get; set; }
        public double? Weight { get; set; }
        public int? Stock { get; set; }
        public virtual ICollection<Image> Images { get; set; }
    }

图片

public class Image
    {
        public int Id { get; set; }
        public int ProductId { get; set; }
        public string FileName { get; set; }
    }

DBContext

 public class TheContext : DbContext
    {
        public TheContext(DbContextOptions<TheContext> options) : base(options)
        {

        }

        public DbSet<Product> Products { get; set; }
        public DbSet<Image> Images { get; set; }

        protected override void OnModelCreating(ModelBuilder modelBuilder)
        {
            modelBuilder.Entity<Product>().HasMany<Image>(s => s.Images);
        }
    }

数据访问

public Product GetById(string id)
        {
            Product product = _context.Products.FirstOrDefault(p => p.FriendlyUrl == id);
            return product;
        }

【问题讨论】:

  • _context.Products.Include(x =&gt; x.Images).FirstOrDefault(...
  • 尝试使用modelBuilder.Conventions.Remove&lt;PluralizingTableNameConvention&gt;();

标签: asp.net-mvc entity-framework asp.net-core


【解决方案1】:

您需要加载相关实体,在您的情况下是图像:

数据访问

public Product GetById(string id)
{
    Product product = _context.Products.include(p => p.Images)
                              .FirstOrDefault(p => p.FriendlyUrl == id);
    return product;
}

在此处阅读有关加载相关实体的更多信息:https://msdn.microsoft.com/en-us/library/jj574232

此外,您希望尽快处理您的上下文,以避免内存泄漏,方法是使用工厂或在需要的地方实例化上下文。

数据访问

public Product GetById(string id)
{
    using(var context = new TheContext())
    {
        product = context.Products.include(p => p.Images)
                         .FirstOrDefault(p => p.FriendlyUrl == id);
        return product;
    }
}

不要在字段变量中保持上下文活动。

在此处阅读有关生命周期的更多信息:https://msdn.microsoft.com/en-us/data/jj729737

【讨论】:

    【解决方案2】:

    这是由于 EF 延迟加载功能造成的。似乎它已关闭。 含义:您需要明确指定要加载的内容。如果开启,集合会在第一次访问时加载

    你可以在这里阅读更多关于它的信息

    https://msdn.microsoft.com/en-us/library/jj574232(v=vs.113).aspx

    或

    http://www.entityframeworktutorial.net/EntityFramework4.3/lazy-loading-with-dbcontext.aspx

    或

    Entity Framework Code First Lazy Loading

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-09-03
      • 2018-11-20
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多