Данное руководство устарело. Актуальное руководство: Руководство по ASP.NET Core
Чтобы хранить данные, нам естественным образом нужна база данных. Как правило, в качестве базы данных используется MS SQL Server, на примере которого мы и посмотрим весь процесс создания БД и подключения к ней.
Мы можем создать базу данных прямо в проекте, либо же создать ее на сервере MS SQL. Для хранения баз данных проекте у нас предназначена папка App_Data. Для этого нажмем правой кнопкой мыши на папку App_Data и в появившемся контекстном меню выберем Add-> New Item.... В появившемся окне добавления нового элемента выберем SQL Server Database и назовем новую базу данных Bookstore.mdf:
Мы можем создать базу данных равнозначным образом и на сервере. После этого база данных добавляется в проект, и мы можем увидеть ее в папке App_Data. Теперь в обозревателе баз данных (окно Database Explorer) мы можем подключиться к ней и создать таблицы, которые будут хранить данные.
Раскроем узел Bookstore.mdf и найдем узел Tables. Нажмем на этот узел правой кнопкой мыши и в появившемся меню выберем пункт Add New Table. И
перед нами появится окно, в котором нам надо определить названия и типы столбцов новой таблицы. По соглашениям о наименованиях таблицы при работе с
Entity Framework должны соответствовать имени модели. То есть, так как наша модель называется Book
, то таблица будет называться Books
.
А Entity Framework автоматически распознает, что таблица Books
соответствует классу Book
.
Итак, создадим структуру таблицы:
Не забудьте установить ниже в окне Properties (в Visual Stidio 2010 - окно Column Properties) для столбца Id соответствующие параметры для первичного ключа:
После этого, если мы работаем с Visual Studio 2010, нам будет предложено просто ввести имя таблицы - введем имя Books, и затем таблица добавляется в БД.
А в Visual Studio Express 2012 for Web нам надо сгенерировать таблицу на основе заданного выше определения. Для этого нажмем на кнопку Update:
В появившемся диалоговом окне нажмем на кнопку Update Database. После этого в нашу базу данных добавляется только что сгенерированная таблица. Подобным образом определим таблицу Purchases для модели Purchase:
Добавим в таблицу Books несколько записей:
Теперь, во-первых, чтобы взаимодействовать с БД, нам нужен класс контекста данных, пусть это будет следующий класс BookContext:
using System; using System.Collections.Generic; using System.Linq; using System.Web; using System.Data.Entity; namespace BookStore.Models { public class BookContext : DbContext { public DbSet<Book> Books { get; set; } public DbSet<Purchase> Purchases { get; set; } } }
Во-вторых, определим строку подключения к БД. Для этого откроем файл Web.config и добавим в конец секции configuration определение строки подключения. Однако тут надо сразу заметить, что для Visual Studio 2010 строка подключения будет отличаться от строки подключения, которая используется в Visual Studio 2012.
Итак, строка подключения для Visual Studio 2010 будет выглядеть так:
<configuration> ......................... <connectionStrings> <add name="BookContext" connectionString="Data Source=.\SQLEXPRESS;AttachDbFilename='|DataDirectory|\Bookstore.mdf';Integrated Security=True;User Instance=True" providerName="System.Data.SqlClient" /> </connectionStrings> </configuration>
Для Visual Studio 2012 будет выглядеть определение строки подключения будет выглядеть следующим образом:
<configuration> ......................... <connectionStrings> <add name="BookContext" connectionString="Data Source=(LocalDB)\v11.0;AttachDbFilename='|DataDirectory|\Bookstore.mdf';Integrated Security=True" providerName="System.Data.SqlClient" /> </connectionStrings> </configuration>
В Visual Studio 2012 в отличие от 2010-й версии мы можем использовать режим LocalDB, который предназначен прежде всего для разработчиков, представляя некоторую упрощенную версию. Поэтому в данном случае в качестве источника данных используется (LocalDB)\v11.0.
Обратите внимание, что в обоих случаях свойство name="BookContext"
должно содержать название контекста данных.
Использование подстановки |DataDirectory| позволяет опустить полный физический путь к базе данных, которая хранится в папке App_Data.
Теперь мы можем получить содержимое таблицы Books в контроллере Home:
public class HomeController : Controller { BookContext db = new BookContext(); public ActionResult Index() { return View(db.Books); } }
И вывести данные в представлении Index.cshtml:
@model IEnumerable<BookStore.Models.Book> @{ Layout = "~/Views/Shared/_Layout.cshtml"; } <div> <h3>Распродажа книг</h3> <table> <tr class="header"><td><p>Название книги</p></td> <td><p>Автор</p></td> <td><p>Цена</p></td><td></td> </tr> @foreach (BookStore.Models.Book b in Model) { <tr> <td><p>@b.Name</p></td> <td><p>@b.Author</p></td> <td><p>@b.Price</p></td> <td><p><a href="/Home/Buy/@b.Id">Купить</a></p></td> </tr> } </table> </div>
Чтобы наверняка быть уверенным, что подключение к базе данных закрыто, следует вызывать метод Dispose
у контекста данных:
protected override void Dispose(bool disposing) { db.Dispose(); base.Dispose(disposing); }
Это переопределенная версия метода Dispose контроллера, которая вызывается при уничтожении объекта контроллера. В нее
помещается вызов db.Dispose()
, который уничтожает все связанные с контекстом данных ресурсы и подключения.