所以我试图将两个表相互关联。我有一个产品表和一个图像表。我在产品对象中有一个图像集合,在图像对象/表中有一个产品 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;
}
最佳答案
您需要加载相关实体,在您的情况下是图像:
数据访问
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
关于asp.net-mvc - Entity Framework 不返回相关对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40643238/