如何在 Entity Framework Core 6 中延迟(惰性)加载二进制属性 byte[] - C#

Jiř*_*dek 9 c# entity-framework-core

我有一个简单的表,其中包含密钥、名称和二进制内容。我只需要在需要时加载二进制内容。这在 Linq2Sql 中曾经非常简单,但在 EF core 6 中,除了导航集合的延迟加载之外,我找不到任何东西,这不是我需要的。我是否遗漏了某些内容,或者 EF core 中缺少此内容吗?吉里

public class Content {
 public int Id { get; set; }
 public string Name { get; set; }
 public byte[] Data { get; set; } // How to delay loading this ? 
}
Run Code Online (Sandbox Code Playgroud)

命令

ctx.Content.Select(x =x.Id==1);
Run Code Online (Sandbox Code Playgroud)

预期的 SQL 是:

SELECT Id, Name FROM Content WHERE Id=1
Run Code Online (Sandbox Code Playgroud)

Iva*_*oev 9

选择性加载某些内容的唯一方法是使用导航属性。

您的情况的解决方案是仅包含byte[]属性的假实体,并配置了表拆分以与主实体共享同一个表。

请注意,这只是逻辑分离,不需要更改数据库架构。表分割文档中的第一行指出:

EF Core 允许将两个或多个实体映射到一行。这称为表拆分表共享

您可能对“分裂”一词感到困惑。它不是拆分数据库中的物理表,而是在多个实体之间拆分(共享)它。

例如

模型

public class Content
{
    public int Id { get; set; }
    public string Name { get; set; }
    public ContentData Data { get; set; }
}

public class ContentData
{
    public byte[] Data { get; set; }
}
Run Code Online (Sandbox Code Playgroud)

配置

modelBuilder.Entity<ContentData>()
    .ToTable("Content"); // must be the same as for Content entity
modelBuilder.Entity<ContentData>()
    .Property<int>("ContentId");
modelBuilder.Entity<ContentData>()
    .HasKey("ContentId");

modelBuilder.Entity<Content>()
    .HasOne(e => e.ContentData)
    .WithOne()
    .HasForeignKey<ContentData>("ContentId");

Run Code Online (Sandbox Code Playgroud)

现在Content.Data不会自动加载,需要时可以使用通常的方式Include加载。唯一的缺点是一个额外的对象实例和实际的byte[]属性访问器——content.Data.Data与原始对象实例相比content.Data