本示例演示在ASP.NET 應用程序中使用EF CORE建立數據庫並對其作基本的增刪改查操做。固然咱們默認你的機器上已經安裝了.NET CORE SDK以及合適的IDE.本例使用的是Visual Studio Code.html
建立一個ASP.NET Core 應用程序
若是你電腦上安裝了VS2015或者更高版本,就可使用項目模板建立一個ASP.NET Core application,或者可使用命令行工具建立項目。在本例中咱們將在Visual Studio Code 中使用命令行工具:數據庫
第一步:建立一個文件夾,哪一個盤都行,假設咱們建立y一個叫作EFCoreWebDemo的文件夾,建立以後用Visual Studio Code 打開,再打開終端窗口:瀏覽器
在終端窗口下執行如下命令:微信
建立一個MVC應用程序> dotnet new mvc
> dotnet add package Microsoft.EntityFrameworkCore.SqlServer --version 2.1.0 > dotnet add package Microsoft.EntityFrameworkCore.Tools --version 2.1.0
從Nuget添加一些須要的包到項目中(這裏必定要注意版本version一致,,不然會報錯,個人本機是2.1.0)mvc
恢復項目的依賴項> dotnet restore
編譯和運行
應用程序應該在端口5000(5001)上運行
https://localhost:5001/> dotnet run
若是在首選瀏覽器中導航到http://localhost:5001,應該會看到標準的Microsoft MVC應用程序正在運行:app
繼續下一步,按Ctrl+C中止運行應用程序async
輸入如下命令看ef命令是否可用,出現以下界面,說明是可用的,ef core安裝成功。ide
建立Model工具
新建一個Model文件夾到項目中,而後在Model文件夾中新建一個EFCoreMvcDemoContext.cs類文件,並給文件中添加以下代碼ui
using Microsoft.EntityFrameworkCore; namespace EFCoreMvcDemo { public class EFCoreMvcDemoContext : DbContext { public DbSet<Book> Books { get; set; } public DbSet<Author> Authors { get; set; } protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder) { optionsBuilder.UseSqlServer(@"Server=.\;Database=EFCoreWebDemo;Trusted_Connection=True;MultipleActiveResultSets=true"); } } }
代碼解析:
EFCoreMvcDemoContext繼承自DbContext。這個類有兩個DbSet屬性,它們表示數據庫中的表(尚未建立)。EFCoreMvcDemoContext類還包括一個名爲onconfiguration的方法,用於定義SQL Server數據庫的鏈接字符串,根據實際狀況更改爲本身的數據庫鏈接便可嘮。
添加Author.cs類,並給其加上如下代碼
using System.Collections.Generic; namespace EFCoreMvcDemo { public class Author { public int AuthorId { get; set; } public string FirstName { get; set; } public string LastName { get; set; } public ICollection<Book> Books { get; set; } = new List<Book>(); } }
再添加Book.cs,並給其添加如下代碼
namespace EFCoreMvcDemo { public class Book { public int BookId { get; set; } public string Title { get; set; } public int AuthorId { get; set; } public Author Author { get; set; } } }
此時能夠執行dotnet build看下應用程序是否有bug。
添加一個遷移
遷移是爲了保持數據庫模式和實體model同步,由於咱們目前尚未數據庫,因此第一次遷移會根據EFCoreMvcDemoContext上的DbSet屬性表示的實體建立數據庫並添加表。
Visual Studio Code不提供建立或者遷移的支持,因此咱們依然要用命令行的方法去遷移,一樣在終端窗口導航到項目文件夾,並執行如下命令:
dotnet ef migrations add CreateDatabase
執行完以後,項目中會多一個名爲Migrations的文件夾,它包含遷移的代碼和模型快照。
執行如下命令執行遷移代碼
dotnet ef database update
刷新如下數據庫,能夠看到名爲EFCoreWebDemo數據庫建立完成,可是咱們也能夠看到表中的全部字段都是nvarchar(max)
使用遷移修改數據庫
在下一節中,您將修改模型以設置所選字符串屬性大小的限制,而後使用遷移將這些更改更新到數據庫。
在Book.cs和Author.cs中增長以下引用:
using System.ComponentModel.DataAnnotations;
修改Book.cs和Author.cs成以下
public class Book { public int BookId { get; set; } [StringLength(255)] public string Title { get; set; } public int AuthorId { get; set; } public Author Author { get; set; } }
public class Author { public int AuthorId { get; set; } [StringLength(50)] public string FirstName { get; set; } [StringLength(75)] public string LastName { get; set; } public ICollection<Book> Books { get; set; } = new List<Book>(); }
最後執行如下命令
dotnet ef migrations add LimitStrings
dotnet ef database update
這將會改變Books表中的Title字段大小,Authors表中的FirstName和LastName大小,咱們以Author表爲例,看下數據庫中的變化:
實踐操做(新增和顯示)
新建一個Web頁面,用於顯示和添加Author,在Controllers文件夾中新加一個AuthorController.cs文件,代碼以下:
using System.Threading.Tasks; using Microsoft.AspNetCore.Mvc; using Microsoft.EntityFrameworkCore; namespace EFCoreMvcDemo.Controllers { public class HomeController : Controller { //從數據庫中檢索全部的Authors,並傳遞給view public async Task<IActionResult> Index() { using (var context = new EFCoreMvcDemoContext()) { var model = await context.Authors.AsNoTracking().ToListAsync(); return View(model); } } [HttpGet] public IActionResult Create() { return View(); } //添加一個Author到數據庫 [HttpPost] public async Task<IActionResult> Create([Bind("FirstName, LastName")] Author author) { using (var context = new EFCoreMvcDemoContext()) { context.Add(author); await context.SaveChangesAsync(); return RedirectToAction("Index"); } } } }
AsNoTracking方法是爲了在查詢的過程當中防止Context沒必要要的追蹤,使得查詢效率更快,由於它用於只讀的狀況。DbContext放在using模塊中實例化,確保其正確的執行。
而後在Views文件夾下添加一個名爲Author的文件夾,在Author文件夾下添加Index.cshtml,代碼以下:
@model IEnumerable<Author> @{ ViewBag.Title = "Authors"; } <h1>@ViewBag.Title</h1> <ul> @foreach (var author in Model) { <li>@author.FirstName @author.LastName</li> } </ul> <div>@Html.ActionLink("New", "create")
再添加Create.cshtml,代碼以下:
@model Author @{ ViewBag.Title = "New Author"; } <h1>@ViewBag.Title</h1> @using(Html.BeginForm()){ <div class="form-group"> @Html.LabelFor(model => model.FirstName) @Html.TextBoxFor(model => model.FirstName, new { @class="form-control"}) </div> <div class="form-group"> @Html.LabelFor(model => model.LastName) @Html.TextBoxFor(model => model.LastName, new { @class="form-control"}) </div> <button type="submit" class="btn btn-default">Submit</button> }
執行命令dotnet run運行,瀏覽器打開鏈接http://localhost:5001/author/create,會看到一個新增頁面以下:
輸入新增Author的FirstName和LastName,提交表格,頁面會跳轉到Index頁面,Index會顯示數據庫中全部Author列表:
![](http://static.javashuo.com/static/loading.gif)
添加相關數據(多個實體)
在下一示例中,將會添加與已存在的做者相關聯的書籍
首先在Controllers文件夾下添加BookController.cs文件,代碼以下:
using System.Threading.Tasks; using System.Linq; using Microsoft.AspNetCore.Mvc; using Microsoft.EntityFrameworkCore; using Microsoft.AspNetCore.Mvc.Rendering; namespace EFCoreMvcDemo.Controllers { public class BookController : Controller { //檢索全部的做者並使用Include方法從數據庫中相關聯的Books也加載出來,返回給View public async Task<IActionResult> Index() { using (var context = new EFCoreMvcDemoContext()) { var model = await context.Authors.Include(a => a.Books).AsNoTracking().ToListAsync(); return View(model); } } [HttpGet] public async Task<IActionResult> Create() { using(var context = new EFCoreMvcDemoContext()) { var authors = await context.Authors.Select(a => new SelectListItem { Value = a.AuthorId.ToString(), Text = $"{a.FirstName} {a.LastName}" }).ToListAsync(); ViewBag.Authors = authors; } return View(); } [HttpPost] public async Task<IActionResult> Create([Bind("Title, AuthorId")] Book book) { using (var context = new EFCoreMvcDemoContext()) { context.Books.Add(book); await context.SaveChangesAsync(); return RedirectToAction("Index"); } } } }
上段代碼再次使用了 AsNoTracking方法,也就是說檢索出來的Authors和Books只是用來顯示,不能被修改。
Index方法:檢索全部的做者並使用Include方法從數據庫中相關聯的Books也加載出來,返回給View。
第一個Create方法:從數據庫中檢索每一個做者並將其投影到一個新表單——SelectListItem。非實體類型不受上下文跟蹤,這就是爲何在本例中不使用AsNoTracking方法的緣由,儘管數據是隻讀的。
第二個Create方法:第二個建立方法的特徵是將實體添加到它的DbSet中,而不是像做者那樣使用DbContext。
在Views文件夾下添加Book文件夾,在Book文件夾下添加文件 Index.cshtml,將如下代碼複製過去:
@model IEnumerable<Author> @{ ViewBag.Title = "Authors and their books"; } <h1>@ViewBag.Title</h1> @if(Model.Any()){ <ul> @foreach(var author in Model){ <li>@author.FirstName @author.LastName <ul> @foreach(var book in author.Books){ <li>@book.Title</li> } </ul> </li> } </ul> } <div>@Html.ActionLink("New", "create")
再在Book文件夾下添加Create.cshtml 文件,複製代碼以下:
@model Book @{ ViewBag.Title = "New Book"; } <h1>@ViewBag.Title</h1> @using(Html.BeginForm()){ <div class="form-group"> @Html.LabelFor(model => model.AuthorId) @Html.DropDownListFor(model => model.AuthorId, (IEnumerable<SelectListItem>)ViewBag.Authors, string.Empty, new { @class="form-control"}) </div> <div class="form-group"> @Html.LabelFor(model => model.Title) @Html.TextBoxFor(model => model.Title, new { @class="form-control"}) </div> <button type="submit" class="btn btn-default">Submit</button> }
執行命令dotnet run運行,瀏覽器打開鏈接http://localhost:5001/book/create,會看到一個新增Book頁面以下:
AuthorId下拉列表是全部數據庫中的做者,選擇一個AuthorId,輸入Title,提交頁面,以後會跳轉到Index頁面,index頁面會顯示全部的Authors和Books:
很easy的就完成了列表展現和新增功能哦。
原文連接:https://www.learnentityframeworkcore.com/walkthroughs/aspnetcore-application
另外歡迎關注個人微信公衆號: