EF Core - не включая двоичные поля - PullRequest
1 голос
/ 14 марта 2019

У меня есть модель EF Core с бинарным полем

class SomeModel {
    string Id;
    string otherProperty;
    byte[] 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();

Я думаю, что мне, возможно, придется поместить большие двоичные объекты во 2-ю таблицу, чтобы я мог вызвать необязательное соединение.

1 Ответ

2 голосов
/ 14 марта 2019

Единственный способ получить отдельную загрузку - это переместить данные в отдельную сущность со взаимно-однозначным отношением.

Хотя это не обязательно должна быть отдельная таблица.Хотя наиболее естественный выбор выглядит как принадлежащий объекту , так как принадлежащие объекты всегда загружаются владельцами, он должен быть обычным объектом, но настроен на разбиение таблицы - в простых словах, поделитесь этой же таблицей с главной сущностью.

Примените ее к вашему образцу:

Модель:

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]

(второй e.Id в select выглядит странно, но я думаю, мы можем жить с этим)

...