Перейти к содержимому

Используем EF 4 в WebMatrix

Несмотря на то, что Entity Framework является достаточно серьёзной ORM-библиотекой, не предназначеной для «начинающих» разработчиков, мы довольно просто можем использовать её в WebMatrix.

Первым делом необходимо добавить библиотеку Microsoft.Data.Entity.CTP.dll в ~/bin нашего сайта. Разумеется, нам также потребуется база данных, для хранения наших обьектов -создайте её, если в Вашем проекте нет ни одной базы.

Теперь нам потребуется модель для нашей ORM: создадим файл в каталоге App_Data с именем
GuestbookEntry.cs:

using System;
using System.ComponentModel.DataAnnotations;
public class GuestbookEntry
{

[ScaffoldColumn(false)]
public int Id { get; set; }
[Required]
[StringLength(30)]
public string Name { get; set; }
[Required]
[StringLength(60)]
public string Email { get; set; }
[Required]
[StringLength(1000)]
public string Message { get; set; }
[Timestamp]
public DateTime Posted { get; set; }

}

Затем нам понадобится Data Context. Создадим файл DataContext.cs:

using System.Data.Entity;
public class DataContext : DbContext
{
public DbSet Guestbook { get; set; }
}

Чтобы было проще работать с данными, создадим «репозиторий» — GuestbookRepository.cs:

using System;
using System.Collections.Generic;
using System.Linq;public class GuestbookRepository
{

private DataContext _ctx = new DataContext();
public GuestbookEntry First(Func where)
{

return _ctx.Guestbook.First(where);

}
public List GetAll()
{

return _ctx.Guestbook.ToList();

}
public void Add(GuestbookEntry entity)
{

entity.Posted = DateTime.Now;
_ctx.Guestbook.Add(entity);
_ctx.SaveChanges();

}
public void Delete(GuestbookEntry entity)
{

_ctx.Guestbook.Remove(entity);
_ctx.SaveChanges();

}

}

 

Последний шаг, который отделяет нас от готовой к использованию системы — нам необходимо удостовериться, что структура базы данных будет создаваться заново каждый раз, когда мы вносим изменения в структуру объектов. Для этого добавьте в файл _start.html следующие строки:

@using db = System.Data.Entity.Infrastructure;
@{
db.Database.SetInitializer(new db.RecreateDatabaseIfModelChanges());
}

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

Вот и всё! Для проверки, создайте файл guestbook.cshtml:

@{
var gb = new GuestbookRepository();if (IsPost)
{
var entry = new GuestbookEntry()
{
Name = "Mikael",
Email = "my@email.com",
Message = "New message!"
};gb.Add(entry);
}var grid = new WebGrid(gb.GetAll());
}@grid.GetHtml()

 

Синтаксис Razor

Перед началом разработки следует рассмотреть синтаксис Razor — нового движка представлений в составе ASP.NET. В настоящее время Razor уже включён в ASP.NET MVC 3, и является единственным доступным движком представлений в WebMatrix.

Основной смысл разработки ситаксиса Razor — уменьшить количество лишних символов, вводимых при разработке представлений в ASP.NET.

Для начала, следует запомнить, что все блоки кода должны быть представлены в фигурных @{ ... } скобках. Подразумевается, что как только вы введёте @, вы начинаете вводить блок кода. Всё, что следует за @, рассматривается как код, если вы не укажете обратное:

@{ var numbers = Enumerable.Range(1, 10); //Get numbers from 1 - 10
foreach(var number in numbers){
}
}

Чтобы в этом цикле отобразить значение переменной, необходимо указать это знаком @ :

@{ var numbers = Enumerable.Range(1, 10);
foreach(var number in numbers){
@number
}
}

Если вы хотите отобразить значение выражения, используйте вот такой @( ... ) синтаксис:

@{ var numbers = Enumerable.Range(1, 10);
foreach(var number in numbers){
@(number * 10)
}
}

Есть несколько способов совместить отображение значения выражения (или переменной) и разметки в блоке кода. Если вы хотите совместить выражения и простой текст, то просто укажите @: перед началом текста:

@{
var numbers = Enumerable.Range(1, 10);
foreach(var number in numbers){
@(number * 10)@: 
}
}

Использовать оператор @: можно 1 раз на всю строку:

@{ var numbers = Enumerable.Range(1, 10); //Get numbers from 1 - 10
foreach(var number in numbers){
@(number * 10)@: * 10 = @(number * 10)
}
}

Также Razor умеет распознавать html-тэги. Если в блоке кода встретится такой тэг, Razor будет считать, что началась часть разметки до тех пор, пока не достигнет парного закрывающего тэга:

@{
var numbers = Enumerable.Range(1, 10); //Get numbers from 1 - 10
foreach(var number in numbers){
<span>@(number * 10)&nbsp;</span>
}
}

Самозакрывающиеся тэги обрабатываются точно также:

@{ var numbers = Enumerable.Range(1, 10); //Get numbers from 1 - 10
foreach(var number in numbers){
@(number * 10)<br />
}
}

Если вы не хотите лишний раз использовать тэги, то можете использовать <text> тэг, это укажет Razor-у, что началась разметка, но тэг <text> не будет отправлен браузеру:

@{ var numbers = Enumerable.Range(1, 10); //Get numbers from 1 - 10
foreach(var number in numbers)
{
<text>@(number * 10) * 10 = @(number * 10)&nbsp;</text>
}
}

Как вы уже заметили, комментарии внутри блока кода могут быть оформлены стандартными средствами языка — двумя прямыми слешами или /*…*/. Также, вне блока кода вы можете использовать @*…*@:

@*Get numbers between 1 - 10*@
@{ /*Get numbers from 1 - 10*/
//Get numbers between 1 - 10
var numbers = Enumerable.Range(1, 10);
foreach(var number in numbers){ @number } }

В следующем примере показано, что для операторов перебора и ветвления необязательно ставить кривые скобки, хватит и просто знака @:

@{ var numbers = Enumerable.Range(1, 10); }

@foreach(var number in numbers){ @number }

@for(var i = 0, i < numbers.Count(); i++){ @numbers.ElementAt(i) }

@if(numbers.Count() == 10)
{
@:10 Numbers - Good!
}

@{var condition = 1; var message = "";}
@switch(condition){
case: 1
message = "Case 1";
break;
case: 2
message = "Case 2";
break;
case: 3
message = "Case 3";
break;
default:
message = "Default Case";
break;
}

Эта небольшая статья описывает всё что нужно для использования Razor внутри ASP.NET Web Pages или WebMatrix. Если вам необходимо больше информации о парсере движка Razor, его развитии и перспективах использования, то вы можете прочитать серию записей Inside Razor в блоге Andrew Nurse.

Эта статья является неполным переводом записи с блога Майкла.

Список изменений в beta2

Список изменений в beta2

Изменения в неймспейсах:

  • Microsoft.Data теперь WebMatrix.Data

Изменения в именах переменных приложения:

  • LayoutPage теперь Layout

Изменения в методах хелперов:

  • Функционал ролей пользователей вынесен из WebSecurity в отдельный класс System.Web.Security.Roles, основной метод проверки вхождения пользователя в роль теперь выглядит вот так: Roles.IsUserInRole([string username], string roleName)

Изменения в структуре приложения:

  • _init.cshtml переименован в _PageStart.cshtml

Изменения в структуре БД:

  • Изменилась структура таблицы webpages_Membership, было добавлено несколько полей, за подробной структурой смотрите Wishlist site template