Как загружать поля varbinary(max) только при необходимости с помощью ADO.NET Entity Framework?

У меня есть поле varbinary(max) в одной из моих таблиц, но оно мне не нужно каждый раз, и я ищу способ получить его из базы данных только при необходимости. Я использую Entity Framework ADO.NET. Как это сделать?


person Emil    schedule 19.03.2009    source источник


Ответы (5)


Решение состояло в том, чтобы создать отдельную таблицу с полем varbinary и установить связь 1-к-1 между таблицами.

person Emil    schedule 20.03.2009
comment
Не всегда возможно в существующей схеме, но, вероятно, это самый простой подход, когда это возможно. Я сделал это с внешним ключом для вторичной таблицы в моей основной таблице, проверяя, является ли FK нулевым или нет, позволяет быстро узнать, существует ли вторичная запись, без необходимости ее фактической загрузки. - person AFract; 23.03.2017

Не обязательно создавать отдельную таблицу. Вы должны сделать несколько шагов. Предположим, что у нас есть таблица «Документы» (Id, Name, Data (varbinary)).

  1. Откройте конструктор EF, скопируйте и вставьте сущность «Документ».
  2. Переименуйте его в «Данные документа». Добавить сопоставление с таблицей «Документы».
  3. Удалить свойство «Данные» в объекте «Документ».
  4. Удалить свойство «Имя» в объекте «DocumentData».
  5. Щелкните правой кнопкой мыши объект DocumentData и добавьте новую ассоциацию. Выберите ассоциацию 1-к-1 с сущностью «Документ».
  6. Выберите новую ассоциацию, перейдите в «Свойства», нажмите «...» в поле «Ссылочное ограничение», выберите объект «Документ» в качестве принципала, оставьте все по умолчанию (Id -> Id) и нажмите «ОК».

Теперь создайте проект.

ПРИМЕЧАНИЕ. Теперь при создании нового объекта «Документ» вы также должны создать новый объект «DocumentData», даже если вы еще не хотите размещать какие-либо данные:

Document doc = new Document();

doc.Name = "My document";
doc.DocumentData = new DocumentData();

context.Documents.Add(doc);
context.SaveChanges();
person Alexey Solonets    schedule 29.01.2011

Одним из способов было бы спроецировать ваш набор результатов в анонимный тип, когда вам не нужен большой двоичный объект:

from entity in context.Entities
select new 
{
    Field1 = entity.Field1,
    Field2 = entity.Field2
}

В этом примере будут загружены только поля Field1 и Field2.

Недостатком этого метода является то, что вы не можете обновить возвращаемый экземпляр и выполнить context.SaveChanges. Хотя я бы сказал, что сохранение экземпляра без полного знания экземпляра небезопасно. Этот метод хорош, когда вам нужен длинный список возвращаемых экземпляров, но вы будете запрашивать один экземпляр, поле varbinary и все остальное, прежде чем вы действительно обновите.

person Craig Stuntz    schedule 19.03.2009
comment
Спасибо за помощь. Я искал что-то похожее на ленивую загрузку поля varbinary :) но похоже, что это невозможно. - person Emil; 20.03.2009

Вы должны удалить свое поле varbinary из таблицы и поместить его в другую таблицу, установив между ними отношения один к одному. Это хорошая практика, потому что вы можете легко реализовать ленивую загрузку и другие вещи.

person MegaMilivoje    schedule 18.09.2012

Разделение таблицы. Инструмент Entity Developer позволяет сделать это визуально. Вы можете сопоставить свою сущность для разных таблиц.

person JackD    schedule 09.02.2011