使用 Entity Framework 6.0,我正在尝试实现表拆分以提高对包含 BLOB 数据的列的表的查询性能。我已遵循本教程中的建议,并且确实按照描述的方式工作。
这是映射到我的一个拆分表的实体类的一个非常简化的示例...
public class MyEntity
{
public string Id { get; set; }
public virtual MyEntityContent Content { get; set; }
public string Name { get; set; }
}
public class MyEntityContent
{
public string Id { get; set; }
public virtual MyEntity Entity { get; set; }
public byte[] Blob { get; set; }
}
...以及相关实现中的相应配置代码DbContext
...
modelBuilder.Entity<MyEntity>().HasKey(e => e.Id).ToTable("MyEntities");
modelBuilder.Entity<MyEntityContent>().HasKey(c => c.Id).ToTable("MyEntities");
modelBuilder.Entity<MyEntity>().HasRequired(e => e.Content).WithRequiredPrincipal(d => d.Entity);
鉴于延迟加载Content
属性是Required
由实体框架提供的,在包含类的构造函数中将其初始化为默认值似乎是明智的MyEntity
......
public MyEntity()
{
Content = new MyEntityContent();
}
...这使得可以创建并部分填充类的新实例,而不会因忘记初始化所需的属性值而引发异常:
var entity = new MyEntity {Id = "XXX", Name = "something"};
我通常使用类似的技术来初始化 EF 实体上的集合属性,并且效果很好。但是,在上面的场景中,构造函数中的这种初始化有一个意想不到的效果:当从数据库中检索现有实体实例时,延迟加载属性中的数据库值被忽略,取而代之的是空的默认值。
这对我来说似乎不合逻辑。实体框架不是通过首先调用其默认构造函数然后将自己的属性值应用于创建的实例来创建实体对象吗?如果是这样,这应该根据数据库数据Content
用 的新实例覆盖我的默认属性值。MyEntityContent
这就是它似乎与延迟加载的集合属性一起工作的方式。
如果无法按照我期望的方式执行此操作,是否有替代技术来初始化延迟加载的属性?