Code First EF6没有检索内部对象?

时间:2015-03-25 14:12:38

标签: c# entity-framework ef-code-first

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

我想我的代码第一次搞砸了......

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

我们保留了旧项目,只更改了我们需要的所有内容并清理了代码,从初始代码中删除了所有自动生成的内容(代码首先来自数据库),因此我们可以先将正确的代码发送到数据库。

这里的问题是类(我简化为两个类而不是整个代码库)ImageCoordinates包含一个Imagedata对象,但在代码中,当我检索到ImageCoordinates时,它为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类包含

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

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

3 个答案:

答案 0 :(得分:2)

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

public virtual ImageData ImageData { get; set; }

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

答案 1 :(得分:1)

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

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

在此link中,如果要为实体启用延迟加载并让实体框架跟踪更改发生时类中的更改,您将找到关于必须遵循的要求的良好解释。

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

答案 2 :(得分:1)

您想要的功能是 延迟加载 。它默认启用。它必须获得所有使用virtual关键字声明的子项。因此,请考虑将此属性更改为virtual

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

或者您可以使用Include来加载在查询中声明的子实体。此过程称为预先加载

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

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

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