Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:

ASP.NET MVC Урок 1-F / ASP NET.MVC Урок 3

.pdf
Скачиваний:
50
Добавлен:
09.03.2016
Размер:
1.63 Mб
Скачать

 

m

6

AM

L

6

L

L

И UserRole

ID

UserID

RoleID

 

 

 

1

1

1

 

 

 

2

1

2

 

 

 

3

2

2

 

 

 

Создадим консольный проект Lesson3 и подключим LessonProject.Model. Добавим сборку

System.Configuration и System.Data.Linq. Проинициализируем context и выведем данные о ролях:

FODVV 3URJUDP

^

VWDWLF YRLG 0DLQ VWULQJ>@ DUJV

^

YDUFRQWH[W QHZ/HVVRQ3URMHFW'E'DWD&RQWH[W &RQILJXUDWLRQ0DQDJHU &RQQHFWLRQ6WULQJ V>&RQQHFWLRQ6WULQJ@ &RQQHFWLRQ6WULQJ

YDUUROHV FRQWH[W 5ROHV 7R/LVW

IRUHDFK YDUUROHLQUROHV

^

&RQVROH :ULWH/LQH^ ` ^ ` ^ `UROH ,' UROH &RGH UROH 1DPH

`

&RQVROH 5HDG/LQH

`

`

Для добавления строки в Role делаем так:

YDUQHZ5ROH QHZ5ROH

^

&RGH PDQDJHU

1DPH Ɇɟɧɟɞɠɟɪ

`

FRQWH[W 5ROHV ,QVHUW2Q6XEPLW QHZ5ROH

FRQWH[W 5ROHV &RQWH[W 6XEPLW&KDQJHV

Для удаления строки в Role делаем так:

YDUUROH FRQWH[W 5ROHV :KHUH S ! S 1DPH Ɇɟɧɟɞɠɟɪ)LUVW2U'HIDXOW

LIUROH QXOO

^

FRQWH[W 5ROHV 'HOHWH2Q6XEPLW UROH

FRQWH[W 5ROHV &RQWH[W 6XEPLW&KDQJHV

`

Для изменения данных делаем так:

YDUUROH FRQWH[W 5ROHV :KHUH S ! S 1DPH Ɇɟɧɟɞɠɟɪ)LUVW2U'HIDXOW

LIUROH QXOO

^

UROH 1DPH Ɇɚɧɚɝɟɪ

FRQWH[W 5ROHV &RQWH[W 6XEPLW&KDQJHV

`

Для манипуляции данных используется язык запросов Linq. Мы рассмотрим только некоторые основные функции Linq. Linq применяется для типов реализующий интерфейс IQueryable<>

.Where() – основная функция фильтрации. Возвращает тип IQueryable. Условие внутри должно возвращать булево значение (bool).

YDUUROHV FRQWH[W 5ROHV :KHUH S ! S 1DPH Ɇɟɧɟɞɠɟɪ

.FirstOrDefault() — .First(), .Single(), .SingleOrDefault() – получают первую или единственную запись. Если записи нет, то FirstOrDefault() или SingleOrDefault() возвращают null (на самом деле, значение по умолчанию этого типа [default(int)], например).

YDUUROHV FRQWH[W 5ROHV :KHUH S ! S 1DPH Ɇɟɧɟɞɠɟɪ)LUVW2U'HIDXOW

– получаем первую (или не получаем) роль названную «Менеджер».

.Take() – выбирает N первых записей

YDUUROHV FRQWH[W 5ROHV :KHUH S ! S 1DPH Ɇɟɧɟɞɠɟɪ7DNH

– выберет 4 первые записи

.Skip() – пропускает выбор N первых записей

YDUUROHV FRQWH[W 5ROHV :KHUH S ! S 1DPH Ɇɟɧɟɞɠɟɪ6NLS 7DNH

– пропустит первые 2 и выберет 3 следующие записи

.OrderBy() – сортирует по возрастанию. А также OrderByDescending(), ThenBy(), ThenByDescending(). Лямбда­выражение должно возвращать тип int, по которому и будет происходить сортировка.

YDUUROHV FRQWH[W 5ROHV :KHUH S ! S 1DPH Ɇɟɧɟɞɠɟɪ2UGHU%\ S ! S ,'

– сортирует по порядку

.Count() – получает количество записей

YDUUROHV&RXQW FRQWH[W 5ROHV :KHUH S ! S 1DPH Ɇɟɧɟɞɠɟɪ&RXQW

– количество записей

.Any() – существует одна или больше записей по данному условию

var rolesExist = context.Roles.Where(p => p.Name == «Менеджер»).Any() – есть ли запись такая

. Select() – возвращает IQueryable произвольного типа, может быть даже dynamic:

YDURWKHU5ROH FRQWH[W 5ROHV :KHUH S ! S 1DPH Ɇɟɧɟɞɠɟɪ6HOHFW S !QHZ^

,' S ,' .RG S &RGH`

– получаем динамический тип, сформированный на основе Role.

.SelectMany() – возвращает объединение всех IQueryable типов внутри выборки:

YDURWKHU5ROH FRQWH[W 5ROHV :KHUH S ! S 1DPH Ɇɟɧɟɞɠɟɪ6HOHFW0DQ\ S ! S 8VHU5ROHV

– получаем все UserRole из роли, названной «Менеджер»

.Distinct() – удаляет дубликаты

YDUPDQDJHUV FRQWH[W 5ROHV :KHUH S ! S 1DPH Ɇɟɧɟɞɠɟɪ6HOHFW0DQ\ S ! S 8VHU5ROH

V 6HOHFW S ! S 8VHU 'LVWLQFW

– все пользователи с ролью названной «Менеджер»

Примечание: )LUVW )LUVW2U'HIDXOW 6LQJOH 6LQJOH2U'HIDXOW$Q\ &RXQW

могут применять параметр, соответствующий :KHUH, тем самым, можно сокращать запись:

YDUUROHV FRQWH[W 5ROHV )LUVW2U'HIDXOW S ! S 1DPH Ɇɟɧɟɞɠɟɪ

Больше примеров и вариантов использования linq вы сможете найти: http://code.msdn.microsoft.com/101­LINQ­Samples­3fb9811b

Создание репозитория IRepository, SqlRepository.

Собственно с БД мы уже можем работать, только теперь нужно отделить модель данных от конкретной реализации, т.е. наши контроллеры про context и System.Data.Linq вообще не должны ничего знать.

Для этого создадим интерфейс IRepository, где будет дан доступ к данным, а также выведены методы для создания, изменения и удаления этих данных.

SXEOLF LQWHUIDFH ,5HSRVLWRU\

^

,4XHU\DEOH 5ROH! 5ROHV ^JHW`

ERRO &UHDWH5ROH5ROH LQVWDQFH

ERRO 8SGDWH5ROH5ROH LQVWDQFH

ERRO 5HPRYH5ROH LQWLG5ROH

«

`

Реализацию назовем SqlRepository. Так как мы с данным контекстом SqlRepository не хотим особо связывать, то добавим Ninject модуль в проект LessonProject.Model:

,QVWDOO 3DFNDJH 1LQMHFW

Создадим класс SqlRepository:

SXEOLF FODVV 6TO5HSRVLWRU\ ,5HSRVLWRU\

^

>,QMHFW@

SXEOLF/HVVRQ3URMHFW'E'DWD&RQWH[W 'E ^JHW VHW`

SXEOLF,4XHU\DEOH 5ROH! 5ROHV

^

JHW^WKURZ QHZ1RW,PSOHPHQWHG([FHSWLRQ `

`

SXEOLF ERRO &UHDWH5ROH5ROH LQVWDQFH

^

WKURZ QHZ1RW,PSOHPHQWHG([FHSWLRQ

`

SXEOLF ERRO 8SGDWH5ROH5ROH LQVWDQFH

^

WKURZ QHZ1RW,PSOHPHQWHG([FHSWLRQ

`

SXEOLF ERRO 5HPRYH5ROH LQWLG5ROH

^

WKURZ QHZ1RW,PSOHPHQWHG([FHSWLRQ

`

`

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

partial, а в папке создадим реализации интерфейса IRepository, разбитые по каждой таблице. Назовем файл Role:

SXEOLF SDUWLDO FODVV 6TO5HSRVLWRU\

^

SXEOLF,4XHU\DEOH 5ROH! 5ROHV

^

JHW

^

UHWXUQ'E 5ROHV

`

`

SXEOLF ERRO &UHDWH5ROH5ROH LQVWDQFH

^

LILQVWDQFH ,'

^

'E 5ROHV ,QVHUW2Q6XEPLW LQVWDQFH

'E 5ROHV &RQWH[W 6XEPLW&KDQJHV

UHWXUQ WUXH

`

UHWXUQ IDOVH

`

SXEOLF ERRO 5HPRYH5ROH LQWLG5ROH

^

5ROH LQVWDQFH 'E 5ROHV )LUVW2U'HIDXOW S ! S ,' LG5ROH

LILQVWDQFH QXOO

^

'E 5ROHV 'HOHWH2Q6XEPLW LQVWDQFH

'E 5ROHV &RQWH[W 6XEPLW&KDQJHV

UHWXUQ WUXH

`

UHWXUQ IDOVH

`

`

Небольшой проект содержит от 10 до 40 таблиц, большой проект от 40, и всё это хотелось бы как­то автоматизировать. Создадим несколько сниппетов, для IRepository и для SqlRepository. Сниппеты – это уже готовые шаблоны кода, которые вызываются с помощью intelliSence, и позволяют быстро создавать код.

Сниппеты

Для IRepository таблиц, создадим table.snippet:

&RGH6QLSSHWV

[POQV KWWS VFKHPDV PLFURVRIW FRP 9LVXDO6WXGLR &RGH6QLSSHW!&RGH6QLSSHW )RUPDW !

+HDGHU!

7LWOH!

7DEOH

7LWOH!

6KRUWFXW!7DEOH6KRUWFXW!

+HDGHU!

6QLSSHW!

'HFODUDWLRQV!

/LWHUDO!

,'!7DEOH,'!

7RRO7LS!7DEOH QDPH IRU FUHDWH7RRO7LS!

'HIDXOW!7DEOH'HIDXOW!

/LWHUDO!

'HFODUDWLRQV!

&RGH /DQJXDJH &6KDUS!

>&'$7$>

UHJLRQ 7DEOH

,4XHU\DEOH 7DEOH ! 7DEOH V ^ JHW `

ERRO &UHDWH 7DEOH 7DEOH LQVWDQFH

ERRO 8SGDWH 7DEOH 7DEOH LQVWDQFH

ERRO 5HPRYH 7DEOH LQW LG 7DEOH

HQGUHJLRQ

@@!

&RGH!

6QLSSHW!&RGH6QLSSHW!&RGH6QLSSHWV!

Для SqlRepository создадим сниппет sqlTable.snippet:

&RGH6QLSSHWV

[POQV KWWS VFKHPDV PLFURVRIW FRP 9LVXDO6WXGLR &RGH6QLSSHW!

&RGH6QLSSHW )RUPDW !

+HDGHU!

7LWOH!

6TO UHSRVLWRU\

7LWOH!

6KRUWFXW!VTOWDEOH6KRUWFXW!

+HDGHU!

6QLSSHW!

'HFODUDWLRQV!

/LWHUDO!

,'!7DEOH,'!

7RRO7LS!7DEOH QDPH IRU FUHDWH7RRO7LS!

'HIDXOW!7DEOH'HIDXOW!

/LWHUDO!

'HFODUDWLRQV!

&RGH /DQJXDJH &6KDUS!

>&'$7$>

SXEOLF ,4XHU\DEOH 7DEOH ! 7DEOH V

^

JHW

^

UHWXUQ 'E 7DEOH V

`

`

SXEOLF ERRO &UHDWH 7DEOH 7DEOH LQVWDQFH

^

LI LQVWDQFH ,'

^

'E 7DEOH V ,QVHUW2Q6XEPLW LQVWDQFH

'E 7DEOH V &RQWH[W 6XEPLW&KDQJHV

UHWXUQ WUXH

`

UHWXUQ IDOVH

`

SXEOLF ERRO 8SGDWH 7DEOH 7DEOH LQVWDQFH

^

7DEOH FDFKH 'E 7DEOH V :KHUH S ! S ,' LQVWDQFH ,' )LUVW2U'HIDXOW

LI FDFKH QXOO

^

72'2 8SGDWH ILHOGV IRU 7DEOH

'E 7DEOH V &RQWH[W 6XEPLW&KDQJHV

UHWXUQ WUXH

`

UHWXUQ IDOVH

`

SXEOLF ERRO 5HPRYH 7DEOH LQW LG 7DEOH

^

7DEOH LQVWDQFH 'E 7DEOH V :KHUH S ! S ,' LG 7DEOH )LUVW2U'HIDXOW

LI LQVWDQFH QXOO

^

'E 7DEOH V 'HOHWH2Q6XEPLW LQVWDQFH

'E 7DEOH V &RQWH[W 6XEPLW&KDQJHV

UHWXUQ WUXH

`

UHWXUQ IDOVH

`

@@!

&RGH!

6QLSSHW!&RGH6QLSSHW!&RGH6QLSSHWV!

Для того, чтобы добавить code­snippet. откроем TOOLS ­> Code Snippet Manager… (Ctrl­K, B). В

окне нажимаем Import и импортируем оба сниппета в My Code snippet:

Finish, OK.

Используем для таблиц User и UserRole.

Осталось прописать только поля для 8SGDWH [имя таблицы], но это уже меньше работы.

Proxy

Как видим, классы, которые мы используем, являются partial, поэтому их можно дополнить. Создадим, подобно SqlRepository, папку Proxy, где будем размещать partial классы. Например, для класса User создадим метод, который автоматически генерирует строку, требуемую для активации пользователя:

SXEOLF SDUWLDO FODVV 8VHU

^

SXEOLF VWDWLF VWULQJ *HW$FWLYDWH8UO

^

UHWXUQ*XLG 1HZ*XLG 7R6WULQJ1

`

`

Используем это:

SXEOLF ERRO &UHDWH8VHU8VHU LQVWDQFH

^

LILQVWDQFH ,'

^

LQVWDQFH$GGHG'DWH 'DWH7LPH 1RZ

Соседние файлы в папке ASP.NET MVC Урок 1-F