Разбиение таблицы типа наследуемого объекта?

У меня есть тип объекта, называемый Image, который наследуется от Publication (существует 5 других типов публикаций, все имеют 10 общих свойств).

К сожалению, таблица Image в моей БД включает в себя 4 двоичных столбца с данными для 4-х версий изображения при разных разрешениях, поэтому есть 4 свойства типа изображения EF: BinOriginal, BinHiRes, BinLowRes, BinThumbnail, которые содержат очень большие объемы данных.

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

Итак, я пробовал разбиение таблиц, поместив 4 двоичных поля в новый объект ImageFile a la: http://blogs.msdn.com/b/adonet/archive/2008/12/05/table-splitting-mapping-multiple-entity-types-to-the-same-table.aspx

Я обеспечил правильное сопоставление таблиц, добавил ассоциацию 1-1 и включил ссылочное ограничение, но я получаю эту ошибку:

Error 3033: Problem in mapping fragments starting at line 2731:EntitySets 
'ImageFiles' and 'Publications' are both mapped to table 'Images'. Their primary 
keys may collide.

... кажется, существует проблема в том, что разделяемая таблица участвует в отношениях наследования.

Я пробовал наследовать новый ImageFile EF-тип из публикации, но потом я получаю сообщение об ошибке:

Problem in mapping fragments starting at lines 2332, 2374:Two entities with 
different keys are mapped to the same row

ВОПРОС Есть ли какой-либо путь вокруг этого, или тот факт, что мне нужен тип изображения EF для наследования из публикации исключить разделение других полей на новый тип?

Ответ 1

Вы можете рассматривать это ограничение для платформы Entity Framework: на самом деле две части, модель базового элемента базы данных и объект, который создается из модели. Подкласс Entity не влияет на модель вообще.

Если вы не хотите загружать все данные для строки модели, спросите ее:

var results = from product in myDB.Products
              where product.Id == productId
              select New 
              {
                  Id = product.Id, 
                  Name = product.Name, 
                  ImageUrl = product.ImageUrl
              };

SQL-запрос, созданный Entity Framework, выбирает только столбцы в предложении select запроса LINQ.

Это также удерживает Entity Framework от хранения строки таблицы в объекте ObjectContext (или DBContext для EF 5).

В качестве побочного примечания я был бы лично соблазн хранить большие двоичные данные в решении NoSQL и просто поддерживать собственный ключ в базе данных SQL самостоятельно.