Сопоставить два разных объекта в одной таблице? - PullRequest
38 голосов
/ 23 февраля 2011

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

Что я хотел бы сделать, это добавить объект вручную, а затем просто отобразитьэто к исходной таблице, но удалите столбцы, которые мне не нужны.Я все это настроил, но получаю довольно очевидную ошибку:

Проблема в отображении фрагментов ... EntitySets 'FmvHistoryTrimmed' и 'FMVHistories' отображаются в таблицу 'FMVHistory'.Их первичные ключи могут сталкиваться.

Есть ли другой способ, которым я должен пойти по этому поводу?Опять же, в большинстве случаев используются все столбцы, поэтому я не хочу обрезать исходную сущность и помещать «лишние» поля в сложный тип.

Ответы [ 2 ]

34 голосов
/ 23 февраля 2011

Вы не можете отобразить два обычных объекта в одну таблицу. У вас есть несколько вариантов:

  1. Использовать разбиение таблицы.
  2. Использовать пользовательский запрос с проекцией на не-тип объекта (как предложено @Aducci)
  3. Использовать QueryView
  4. Использовать представление базы данных или напрямую DefiningQuery

Разделение таблицы

Разделение таблицы позволяет сопоставить таблицу на две сущности в отношении 1: 1. Первая сущность будет содержать только PK и подмножество полей, которые вам нужны всегда. Вторая сущность будет содержать все остальные поля и PK. Обе сущности будут содержать свойство навигации друг для друга. Теперь, если вам нужно только подмножество полей, вы будете запрашивать первый объект. Если вам нужны все поля, вы запросите первую сущность и добавите свойство навигации к второй сущности. Вы также можете лениво загрузить второй объект, если он вам нужен.

QueryView

QueryView - это запрос ESQL, определенный непосредственно в вашем отображении (MSL), и он сопоставлен с новым типом сущности только для чтения. Вы можете использовать QueryView, чтобы определить проекцию вашей полной сущности в сущности. QueryView должен быть определен вручную в EDMX (он не доступен в дизайнере). Как я знаю, QueryView вначале недоступен в коде, но на самом деле он такой же, как и пользовательская проекция на не-тип объекта.

DefiningQuery

DefiningQuery - это пользовательский запрос, определенный непосредственно в вашей модели хранения (SSDL). DefiningQuery обычно используется при сопоставлении с представлениями базы данных, но вы можете использовать его для любого пользовательского SQL SELECT. Вы отобразите результат запроса на тип объекта только для чтения. DefiningQuery должен быть определен вручную в EDMX (он недоступен в дизайнере). Он также непосредственно не доступен в Code сначала, но на самом деле это то же самое, что вызов SqlQuery на DbDatabase. Проблема с DefiningQuery заключается в том, что после того, как вы вручную определите его в SSDL, вы не сможете использовать Обновить модель из базы данных, поскольку эта операция заменяет полный SSDL и удаляет определение вашего запроса.

8 голосов
/ 23 февраля 2011

Я бы создал представление в базе данных, содержащее только те данные, которые вам нужны, и добавил бы представление в модель данных вашей сущности.

Если вы не хотите изменять базу данных, вы можете создать Linq длясущности или оператор ESQL, проецируемый в класс POCO с только необходимой информацией.

public IQueryable<SimpleObject> GetView(DBContext context)
{
    return  (from obj in context.ComplexObjects
            select new SimpleObject() { Property1 = obj.Property1,
                                        Property1 = obj.Property2
                                      }); 
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...