3

使用 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这就是它似乎与延迟加载的集合属性一起工作的方式。

如果无法按照我期望的方式执行此操作,是否有替代技术来初始化延迟加载的属性?

4

1 回答 1

0

不要初始化虚拟成员,如果必须,也许可以处理来自未初始化成员的任何异常。

我刚刚遇到了一个具有两个虚拟字段的实体的问题。最初我让它初始化这两个,但在删除它们(并将其他字段初始化为某个默认值)之后,它开始为我工作。试试看,让我知道!

[编辑]我刚刚意识到我回复了一个稍微旧的帖子,没有看到日期。我想我会把这个答案留在这里以防万一。

于 2014-03-19T19:15:27.353 回答