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;
...
}
明显的重复是针对 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;
...
}