下面通过实例来学习EF Core Code First,也就是通过EF Core迁移来完成从模型生成数据库。
本实例使用EntityFrameworkCore SQLite 数据库进行介绍,大家也可以无缝切换到其他数据库。
目前 EF Core 支持的数据库:
- Microsoft SQL Server
- SQLite
- Postgres (Npgsql)
- SQL Server Compact Edition
- InMemory (for testing purposes)
- MySQL
- IBM DB2
1.新建项目
新建项目,选择.NET Core,然后选择ASP.NET Core Web Application (.NET Core),将其命名为EFCoreDemo,如下图所示。
单击“确定”按钮以后,出现选择模板对话框;选择Web应用程序模板,并将“身份验证”设置为“不进行身份验证”,如下图所示。
2.引用Entity Framework Core
在NuGet命令行下安装引用:
Install-Package Microsoft.EntityFrameworkCore.Sqlite
也可以使用NuGet包在管理器中搜索Microsoft.EntityFrameworkCore.Sqlite来安装。
3.创建实体
在项目中添加一个Models文件夹,然后在Models文件夹通过右键快捷菜单新建一个类User.cs:
public class User { public int Id { get; set; } public string UserName { get; set; } public string Password { get; set; } }
继续新建一个类DataContext.cs:
public class DataContext : DbContext { public DataContext(DbContextOptions<DataContext> options) : base(options) { } public DbSet<User> Users { get; set; } }
4.创建数据库
打开Startup.cs,在ConfigureServices方法中添加如下代码:
public void ConfigureServices(IServiceCollection services) { var connection = "Filename=./efcoredemo.db"; services.AddDbContext<DataContext>(options => options.UseSqlite(connection)); // Add framework services. services.AddMvc(); }
需要 using Microsoft.EntityFrameworkCore;
添加好以后,接着来安装引用Microsoft.EntityFrameworkCore.Tools。使用NuGet命令行:
Install-Package Microsoft.EntityFrameworkCore.Tools
下面开始创建数据库,这里在程序包管理控制台执行命令进行迁移及更新。
打开VS 2017菜单 工具→NuGet包管理器→程序包管理控制台。
首先输入Add-Migration MyFirstMigration执行,接着输入Update-Database执行。出现Done.表示成功创建数据库。
如果需要使用dotnet ef 命令,首先打开EFCoreDemo.csproj 文件编辑,在Project节点中添加如下
<ItemGroup> <DotNetCliToolReference Include="Microsoft.EntityFrameworkCore.Tools.DotNet" Version="1.0.0" /> </ItemGroup>
如果是在VS中编辑则会自动还原,外面编辑需要手动dotnet restore。
还原好以后就可以使用dotnet ef 命令。
在命令提示符中首先输入dotnet ef migrations add MyFirstMigration,然后再输入dotnet ef database update。
出现成功的提示,这样我们就创建好了数据库,如下图所示。更多EF命令介绍请输入dotnet ef -h。
5.项目使用
在Controllers文件夹上右击,在弹出的右键快捷菜单中单击“添加”→“新建项”,新建一个MVC控制器类UserController:
UserController.cs
public class UserController : Controller { private DataContext _context; public UserController(DataContext context) { _context = context; } // GET: /<controller>/ public IActionResult Index() { return View(_context.Users.ToList()); } public IActionResult Register() { return View(); } [HttpPost] [ValidateAntiForgeryToken] public IActionResult Register(User registeruser) { if (ModelState.IsValid) { _context.Users.Add(registeruser); _context.SaveChanges(); return RedirectToAction("Index"); } return View(registeruser); } }
你会注意到控制器需要DataContext作为构造函数的参数。ASP.NET Core依赖注入将通过构造函数注入DataContext到控制器。
Index action显示所有用户,Register action注册用户是将用户添加至用户表。
然后在Views文件夹中添加一个User文件夹,然后添加一个Index视图:
Index.cshtml
@model IEnumerable<EFCoreDemo.Models.User> @{ ViewBag.Title = "用户"; } <table class="table"> <tr> <th>Id</th> <th>用户名</th> </tr> @foreach (var item in Model) { <tr> <td> @Html.DisplayFor(modelItem => item.Id) </td> <td> @Html.DisplayFor(modelItem => item.UserName) </td> </tr> } </table>
接下来再添加一个 Register视图。
@model EFCoreDemo.Models.User @{ ViewBag.Title = "用户添加"; } <form asp-controller="User" asp-action="Register" method="post"> <div class="form-group"> <label asp-for="UserName" class="col-md-2 control-label">用户名:</label> <div class="col-md-10"> <input class="form-control" asp-for="UserName" /> <span asp-validation-for="UserName" class="text-danger"></span> </div> <label asp-for="Password" class="col-md-2 control-label">密码:</label> <div class="col-md-10"> <input class="form-control" asp-for="Password" /> <span asp-validation-for="Password" class="text-danger"></span> </div> <div class="col-md-offset-2 col-md-10"> <input type="submit" value="保存" class="btn btn-default" /> </div> </div> </form>
在调试那里选择EFCoreDemo启动,最后程序运行起来,在地址栏输入http://localhost:5000/User/Register访问注册。
在注册那里填入用户信息。注册成功后将跳转至http://localhost:5000/User,如下图所示。
本文是对《ASP.NET Core跨平台开发从入门到实战》 6.2 Code First 的更新,亦是对之前的博文ASP.NET Core 开发 - Entity Framework (EF) Core的更新。
如果你觉得本文对你有帮助,请点击“推荐”,谢谢。