Разбиение таблицы типа наследуемого объекта?
У меня есть тип объекта, называемый 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 самостоятельно.