EF Core - 不包括二进制字段

EF Core - unincluding binrary fields

我有一个具有二进制字段的 EF Core 模型

class SomeModel {
    string Id;
    string otherProperty;
    byte[] blob;
};

通常,当我查询数据库时,我想 return 这个模型的列表 - 然后,在后续调用中,只查询一个实体,但 return blob。

我在数据或代码中看不到一种方法来阻止 EF Core 始终支付检索 blob 字段的费用。

我真的很想说这样的话:

var list = await Context.SomeModels.ToListAsync();

// later
var item = await Context.SomeModels
  .Where(m=>m.Id==someId)
  .Include(m=>m.blob)
  .FirstOrDefaultAsync();

我想我可能必须将 blob 放入第二个 table 中,这样我才能强制执行可选的连接。

获得单独加载的唯一方法是将数据移动到具有一对一关系的单独实体。

虽然它不需要是一个单独的 table。虽然最自然的选择看起来是 owned entity, since owned entities are always loaded with the owners, it has to be a regular entity, but configured with table splitting - 简而言之,与主要实体共享相同的 table。

将其应用于您的示例:

型号:

public class SomeModel
{
    public string Id { get; set; }
    public string OtherProperty { get; set; }
    public SomeModelBlob Blob { get; set; }
};

public class SomeModelBlob
{
    public string Id { get; set; }
    public byte[] Data { get; set; }
}

配置:

modelBuilder.Entity<SomeModelBlob>(builder =>
{
    builder.HasOne<SomeModel>().WithOne(e => e.Blob)
        .HasForeignKey<SomeModelBlob>(e => e.Id);
    builder.Property(e => e.Data).HasColumnName("Blob");
    builder.ToTable(modelBuilder.Entity<SomeModel>().Metadata.Relational().TableName);
});

用法:

代码:

var test = context.Set<SomeModel>().ToList();

SQL:

  SELECT [s].[Id], [s].[OtherProperty]
  FROM [SomeModel] AS [s]

代码:

var test = context.Set<SomeModel>().Include(e => e.Blob).ToList();

SQL:

  SELECT [e].[Id], [e].[OtherProperty], [e].[Id], [e].[Blob]
  FROM [SomeModel] AS [e]

select 中的第二个 e.Id 看起来很奇怪,但我想我们可以接受)