Данное руководство устарело. Актуальное руководство: Руководство по ASP.NET Core
Для хранения данных приложению нужна база данных. Мы можем использовать различные СУБД, но, как правило, в качестве базы данных в связке с ASP.NET MVC используется база данных MS SQL Server, на примере которого мы и посмотрим весь процесс создания БД и подключения к ней.
Мы можем создать базу данных прямо в проекте, либо же создать ее на сервере MS SQL. Для хранения баз данных в проекте предназначена папка App_Data. Итак, нажмем на папку App_Data правой кнопкой мыши и в появившемся контекстном меню выберем Add-> New Item.... В появившемся окне добавления нового элемента выберем SQL Server Database и назовем новую базу данных Bookstore.mdf:
После этого в папку папку App_Data будет добавлена база данных, и мы можем начинать с ней работать - добавлять таблицы и данные. Но перед этим посмотрим, что у нас будет хранится в БД. Для работы с БД возьмем модели из предыдущих глав - модель Book:
public class Book { public int Id { get; set; } public string Name { get; set; } public string Author { get; set; } public int Price { get; set; } }
И модель Purchase:
public class Purchase { public int PurchaseId { get; set; } public string Person { get; set; } public string Address { get; set; } public int BookId { get; set; } public DateTime Date { get; set; } }
Пусть для работы с ними определен следующий контекст данных:
public class BookContext : DbContext { public DbSet<Book> Books { get; set; } public DbSet<Purchase> Purchases { get; set; } }
Чтобы связать приложение, контекст данных и БД, добавим в файл web.config строку подключения к этой базе данных. Для этого после секции configSections вставим следующую секцию:
<connectionStrings> <add name="BookContext" connectionString="Data Source=(LocalDB)\MSSQLLocalDB;AttachDbFilename='|DataDirectory|\Bookstore.mdf';Integrated Security=True" providerName="System.Data.SqlClient"/> </connectionStrings>
Обратите внимание, что значени атрибута name (name="BookContext"
) в качестве значения имеет название контекста данных.
Есть также второй способ. Например, если у нас строка подключения имеет другое название, например <add name="DefaultConnection"....
, и мы не хотим его менять,
то в этом случае для связи с контекстом данных мы можем передать название в конструкор базового класса:
public class BookContext : DbContext { public BookContext(): base("DefaultConnection") {} public DbSet<Book> Books { get; set; } public DbSet<Purchase> Purchases { get; set; } }
В Visual Studio мы можем использовать LocalDB. LocalDB представляет облегченную версию движка баз данных SQL Sever Express, которая специально нацелена на разработчиков. Поэтому в данном случае в качестве источника данных указываем (LocalDB)\MSSQLLocalDB.
Использование подстановки |DataDirectory| позволяет опустить полный физический путь к базе данных, которая хранится в папке App_Data.
Если мы используем не движок localdb, а полноценный MS SQL Server, то тогда в строку подключения включается название сервера:
<connectionStrings> <add name="BookContext" connectionString="Data Source=.\SQLEXPRESS;Initial Catalog=Bookstore;Integrated Security=True" providerName="System.Data.SqlClient"/> </connectionStrings>
Кроме того, здесь также вместо AttachDbFilename используется название каталога бд "Initial Catalog".
Для других СУБД - MySQL, MongoDB, Postgre и т.д. строка подключения также может отличаться. Но в данном случае мы будем использовать LocalDB.
Теперь создадим сами таблицы. Для этого перейдем в окно Server Explorer и раскроем в нем узел Data Connections. Далее мы увидим узел BookContext, который представляет нашу БД, и также раскроем его:
Добавим первую таблицу. Для этого нажмем правой кнопкой мыши на узел Tables и в появившемся меню выберем пункт Add New Table.
После этого отобразится окно дизайнера таблицы, в котором надо определить названия и типы столбцов новой таблицы. По соглашениям о
наименованиях таблицы при работе с Entity Framework названия таблиц должны соответствовать имени модели. Например, если модель называется Book,
то таблица будет называться Books
. А Entity Framework автоматически распознает, что таблица Books
соответствует
классу Book
.
Итак, создадим структуру таблицы:
Также поскольку предполагается, что столбец Id будет инкрементироваться с добавлением каждого нового объекта, то установим для него автоинкремент в окне Properties:
И последний шаг - генерация базы данных. Для этого нажмем на кнопку Update:
В появившемся диалоговом окне нажмем на кнопку Update Database. После этого в нашу базу данных добавится новая таблица. Подобным образом определим таблицу Purchases для модели Purchase:
Добавим в дизайнере баз данных в таблицу Books несколько записей. Для этого нажмем в окне Server Explorer на узел Books и выберем в появившемся списке пункт Show Table Data. Добавим, к примеру, следующий набор записей:
Теперь мы можем получить эти данные в контроллере 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()
, который уничтожает все связанные с контекстом данных ресурсы и подключения.