Подключение к базе данных

Данное руководство устарело. Актуальное руководство: Руководство по ASP.NET Core

Последнее обновление: 31.10.2015

Для хранения данных приложению нужна база данных. Мы можем использовать различные СУБД, но, как правило, в качестве базы данных в связке с 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(), который уничтожает все связанные с контекстом данных ресурсы и подключения.

Помощь сайту
Юмани:
410011174743222
Перевод на карту
Номер карты:
4048415020898850