Как загружать поля varbinary (max) только при необходимости с ADO.NET Entity Framework? - PullRequest
8 голосов
/ 19 марта 2009

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

Ответы [ 5 ]

6 голосов
/ 20 марта 2009

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

4 голосов
/ 29 января 2011

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

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

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

Примечание. Теперь при создании новой сущности Document вы должны также создать новую сущность DocumentData, даже если вы еще не хотите размещать какие-либо данные:

Document doc = new Document();

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

context.Documents.Add(doc);
context.SaveChanges();
1 голос
/ 18 сентября 2012

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

1 голос
/ 19 марта 2009

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

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

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

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

0 голосов
/ 09 февраля 2011

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

...