2013-03-11 2 views
4

Я новичок в ASPNET и MVC 4, поэтому я думаю, что это может быть непростым вопросом. Однако я не смог правильно ответить Google. Я просто хотел бы отобразить некоторую информацию о продажах - мне нужен только . Мне не нужно вставлять, обновлять или удалять из базовых таблиц.Entity Framework - создать модель с точки зрения?

Существует 3 таблицы SQL Server, из которых необходимо извлечь данные: CurrentSales, SalesPlans и AverageSales. Я создал VIEW для этого и поместил на него уникальный кластеризованный индекс; он содержит некоторые внешние соединения, но имеет логику для обработки любых маловероятных значений NULL.

Я иду в MODELS, добавляю новую модель данных сущности ADO.NET и добавляю свое представление к модели. Он возвращается и говорит «В таблице/представлении« vw_FullView »не указан первичный ключ. Ключ был выведен, и определение было создано как таблица/представление только для чтения». Когда я создаю класс Controller из этой модели и объекта, в представлении не отображаются данные при загрузке веб-сайта.

Однако, если я создаю полностью пустую таблицу - с соответствующим первичным ключом, которая действует как таблица модели, то затем использует хранимую процедуру (как функцию импорта) для получения необходимых данных, все работает полностью хорошо.

Это, очевидно, не может быть правильным способом справиться с этим. Есть ли способ создать сильно типизированную модель из представления? Я предпочел бы, чтобы объекты Controller и View в ASP.NET правильно автоматически генерировались из представления SQL в модели, а не нуждались в том, чтобы эта пустая таблица «обманула» систему.

Большое спасибо заранее.

+0

Покажите нам действие и представление (cshtml) для этого: «Когда я создаю класс контроллера из этой модели и объекта, представление не отображает данные при загрузке веб-сайт." – AaronLS

+0

Aaron - Я дважды проверял, и кажется, что я действительно могу получить доступ к объекту модели с готовым к SQL-представлению в моем представлении MVC, но он не приходит в чистоту и не форматирует красиво. Я собираюсь пойти с одним из нижеперечисленных решений и перекодировать. Благодаря! – Skkra

ответ

3

Объект фреймворк очень не любит виды. Он не может понять, каковы первичные ключи для представления, поэтому он предполагает, что любое поле, не подлежащее обнулению, является частью составного первичного ключа.

В общем, избегайте представлений при использовании Entity Framework. Создайте запрос linq, который делает то, что ваш взгляд делает и использует это вместо этого.

+0

Проблема с этим заключается в том, что представления должны быть необходимы, если вы извлекаете данные из другой базы данных. EF просматривает одну базу данных одновременно, но с видом вы можете получить информацию. – sksallaj

+0

@sksallaj - Нет, не используйте для этого представление. Используйте синтаксисы Sql Server. Вы можете создавать для них модели Code First точно так же, как обычные таблицы, и они работают как таблицы, а не представления. Это сложнее с файлами edmx, но все равно можно сделать. –

+0

Как вы добавляете синонимы в структуру сущностей? У меня есть синонимы, но это вообще не признавалось. Фактически, я думал, что это запрошенная функция EF, которая никогда не была реализована. – sksallaj

1

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

simmdan фактически сделал хорошую работу, объясняющую, как обойти это в MSDN forum

в основном, как и Mystere Man уже отмечалось, при использовании Entity Framework, самый простой способ будет клонировать ваш взгляд, используя реальный объекты, объединенные и отфильтрованные linq.

+0

Я вижу. Из-за различных бизнес-ограничений я пытался избежать использования LINQ и все обрабатывалось/отображалось через хранимые процедуры, которые будут находиться в SQL. Думаю, мне придется выяснить, как это сделать, или просто укусить пулю и использовать LINQ. – Skkra

+0

btw. вы можете использовать стандартное соединение sqlconnection и действовать непосредственно с сохраненной процедурой для чтения/обновления вашего представления. – Ingo

+0

@Skkra - если вы не хотите использовать linq, почему вы используете Entity Framework, то? –

0

Это правда, что Entity Framework не любит представления SQL Server, поскольку первичный ключ не является очевидным в представлении. К сожалению, указание [Key] в модели не представляется достаточным. Однако это можно сделать и очень полезно в 98% случаев, когда есть представление, которое объединяет таблицы, и вы просто хотите отображать его данные в сетке. Ключ (pardon the pun) - правильно определить представление.

Мой первоначальный вид содержит следующие столбцы:

DepartmentCode(varchar(8),not null) 
DepartmentName(varchar(60), not null) 
DivisionCode(varchar(8), null) 
DivisionName(varchar(8), null) 
StatusCode(char(1), not null) 
Virtual(varchar(1), not null) 

и в моей модели я указал

[Key] 
[Column("DepartmentCode")] 
[DatabaseGenerated(DatabaseGeneratedOption.None)] 
[StringLength(8)] 
[Display(Name = "Department Code")] 
public string DepartmentCode { get; set; } 

Когда я scaffolded это и отображается вид Index, я получил сообщение об ошибке со ссылкой на источник ключ. По-видимому, Entity Framework предполагает, что все непустые поля вносят вклад в первичный ключ.

Снятие дополнительных не нулей сделало трюк. Я заставил столбцы в представлении быть обнуляемым, используя следующие:

CREATE view [dbo].[Departments] as 
select DepartmentCode 
,nullif(DepartmentName,'') as DepartmentName 
,nullif(DivisionCode,'') as DivisionCode 
,nullif(DivisionName,'') as DivisionName 
,nullif(StatusCode,'') as StatusCode 
,nullif(Virtual,'') as Virtual 
from .... 

Теперь просмотреть столбцы выглядеть следующим образом

DepartmentCode(varchar(8),not null) 
DepartmentName(varchar(60), null) 
DivisionCode(varchar(8), null) 
DivisionName(varchar(8), null) 
StatusCode(char(1), null) 
Virtual(varchar(1), null) 

После того, как я изменил вид, вид индекса работал правильно.

Я также подтвердил, что представление, содержащее составной (многоколоночный) ключ, также будет работать до тех пор, пока только эти столбцы не являются нулевыми, а в вашей модели вы укажете [Ключ] для каждого столбца, а также добавьте Order = 1 и Order = 2 в аннотации [Column] на этих ключевых столбцах.

Конечно, предполагается, что вы имеете разрешение на изменение вида (или можете создать альтернативное представление). Я могу подтвердить это только на MVC 5 и Entity Framework 6.

Смежные вопросы