Code First EF6 不检索内部对象?

Code First EF6 not retrieving internal objects?

明显的重复是针对 ef5,这是 ef6,但我需要的答案是虚拟的(延迟加载)不存在于明显的重复中

我想我搞砸了我的代码优先方法...

最初我们先从数据库编写代码,一切都运行良好,但是从链上游出现了新的要求,因此我们废弃了该数据库,更新了代码以匹配,然后首先使用代码生成了一个新数据库。

我们保留了旧项目,只是更改了我们需要的所有内容并清理了代码,从初始(数据库中的代码优先)中删除了所有自动生成的内容,因此我们可以先对数据库执行适当的代码。

这里的问题是 class(我将整个代码库简化为两个 classes)ImageCoordinates 包含一个 Imagedata 对象,但是在我检索它的 ImageCoordinates 时在代码中 returns imageData 对象为 null...

public class ImageCoordinate
{
    [Key]
    public Guid uid { get; set; }

    [StringLength(50)]
    public string coordinates { get; set; }

    public ImageData ImageData { get; set; }
}

public class ImageData
{
    [Key]
    public Guid uid { get; set; }

    [Column("imageData")]
    public byte[] imageData1 { get; set; }

    [StringLength(50)]
    public string fileName { get; set; }
}

dbContext class 包含

public class dbContext : DbContext
{
    public dbContext(string connectionString)
        : base(connectionString)
    {
    }
    public virtual DbSet<ImageCoordinate> ImageCoordinates { get; set; }
    public virtual DbSet<ImageData> ImageDatas { get; set; }
}

检索时...

var foo = dc.ImageCoordinates.FirstOrDefault(x => x.uid == uid);

foo.ImageData //is null

在数据库端自动生成结构....

 uid                                     coordinates    ImageData_uid
AC5712F6-B69B-44FE-A255-3F3227E02802    34,15,158,56    FFE0473D-4CF7-4B26-BE8A-A24FC79B6695

任何人都可以解释我在这里做错了什么以防止系统生成 link 并检索 imageCoordinate 的所有数据吗?

因此,要么将关联的 属性 声明为 virtual 以启用延迟加载,要么使用 Include 在实体化点加载关联数据。

public virtual ImageData ImageData { get; set; }

dc.ImageCoordinates
  .Include(ic => ic.ImageData)
  .FirstOrDefault(x => x.uid == uid);

如果您希望导航属性是 lazy loaded,则需要将它们声明为 virtual:

public class ImageCoordinate
{
   //...
  public virtual ImageData ImageData { get; set; }
}

在此 link 中,您将找到有关要求的很好解释,如果您想为实体启用延迟加载并让 Entity Framework 跟踪 [=] 中的更改,则必须遵循这些要求22=] 随着变化的发生。

仅供参考,EF 有三种加载相关实体的方法:lazy loading, eager loading and explicit loading。最常用的是前两个。

您想要的功能是延迟加载。默认情况下启用。它必须获取所有使用 virtual 关键字声明的子实体。所以考虑把这个属性改成virtual.

public class ImageCoordinate
{
    ...
    public virtual ImageData ImageData { get; set; }
}

或者您可以使用 Include 这将加载已在查询中声明的子实体。此过程称为 Eager Loading

dc.ImageCoordinates
  .Include(x=> x.ImageData)
  .FirstOrDefault(x => x.uid == uid);

此外,您可以在上下文构造函数中手动启用延迟加载:

public MyEntitiesContext() : base("MyEntitiesContext")
{
    this.ContextOptions.LazyLoadingEnabled = true;
    ...
}