У меня есть поле varbinary(max) в одной из моих таблиц, но оно мне не нужно каждый раз, и я ищу способ получить его из базы данных только при необходимости. Я использую Entity Framework ADO.NET. Как это сделать?
Как загружать поля varbinary(max) только при необходимости с помощью ADO.NET Entity Framework?
Ответы (5)
Решение состояло в том, чтобы создать отдельную таблицу с полем varbinary и установить связь 1-к-1 между таблицами.
Не обязательно создавать отдельную таблицу. Вы должны сделать несколько шагов. Предположим, что у нас есть таблица «Документы» (Id, Name, Data (varbinary)).
- Откройте конструктор EF, скопируйте и вставьте сущность «Документ».
- Переименуйте его в «Данные документа». Добавить сопоставление с таблицей «Документы».
- Удалить свойство «Данные» в объекте «Документ».
- Удалить свойство «Имя» в объекте «DocumentData».
- Щелкните правой кнопкой мыши объект DocumentData и добавьте новую ассоциацию. Выберите ассоциацию 1-к-1 с сущностью «Документ».
- Выберите новую ассоциацию, перейдите в «Свойства», нажмите «...» в поле «Ссылочное ограничение», выберите объект «Документ» в качестве принципала, оставьте все по умолчанию (Id -> Id) и нажмите «ОК».
Теперь создайте проект.
ПРИМЕЧАНИЕ. Теперь при создании нового объекта «Документ» вы также должны создать новый объект «DocumentData», даже если вы еще не хотите размещать какие-либо данные:
Document doc = new Document();
doc.Name = "My document";
doc.DocumentData = new DocumentData();
context.Documents.Add(doc);
context.SaveChanges();
Одним из способов было бы спроецировать ваш набор результатов в анонимный тип, когда вам не нужен большой двоичный объект:
from entity in context.Entities
select new
{
Field1 = entity.Field1,
Field2 = entity.Field2
}
В этом примере будут загружены только поля Field1 и Field2.
Недостатком этого метода является то, что вы не можете обновить возвращаемый экземпляр и выполнить context.SaveChanges. Хотя я бы сказал, что сохранение экземпляра без полного знания экземпляра небезопасно. Этот метод хорош, когда вам нужен длинный список возвращаемых экземпляров, но вы будете запрашивать один экземпляр, поле varbinary и все остальное, прежде чем вы действительно обновите.
Вы должны удалить свое поле varbinary из таблицы и поместить его в другую таблицу, установив между ними отношения один к одному. Это хорошая практика, потому что вы можете легко реализовать ленивую загрузку и другие вещи.
Разделение таблицы. Инструмент Entity Developer позволяет сделать это визуально. Вы можете сопоставить свою сущность для разных таблиц.