同系列文章:
参考文章
前提条件
创建新工程
- 工程模板:Visual C#->Web->ASP.NET Core Web Application (.NET Core)
- 项目名称:EFGetStarted.AspNetCore.NewDb
- 模板:Web应用程序
- 身份验证:不进行身份验证
通过NuGet安装Entity Framework并更新文件project.json中“tools”区
- Install-Package Npgsql.EntityFrameworkCore.PostgreSQL
- Install-Package Microsoft.EntityFrameworkCore.Tools -Pre
"tools": { "Microsoft.EntityFrameworkCore.Tools": "1.0.0-preview2-final", "Microsoft.AspNetCore.Razor.Tools": "1.0.0-preview2-final", "Microsoft.AspNetCore.Server.IISIntegration.Tools": "1.0.0-preview2-final" },
创建Model
Model.cs
using Microsoft.EntityFrameworkCore; using System.Collections.Generic; namespace EFGetStarted.AspNetCore.NewDb.Models { public class BloggingContext : DbContext { public BloggingContext(DbContextOptions<BloggingContext> options) : base(options) { } public DbSet<Blog> Blogs { get; set; } public DbSet<Post> Posts { get; set; } } public class Blog { public int BlogId { get; set; } public string Url { get; set; } public List<Post> Posts { get; set; } } public class Post { public int PostId { get; set; } public string Title { get; set; } public string Content { get; set; } public int BlogId { get; set; } public Blog Blog { get; set; } } }
通过依赖注入注册上下文
在Startup.cs中引入命名空间
using EFGetStarted.AspNetCore.NewDb.Models; using Microsoft.EntityFrameworkCore;
更新Startup.cs中的ConfigureServices成员方法
// This method gets called by the runtime. Use this method to add services to the container. public void ConfigureServices(IServiceCollection services) { // Add framework services. services.AddApplicationInsightsTelemetry(Configuration); services.AddDbContext<BloggingContext>(options =>options.UseNpgsql(Configuration.GetConnectionString("DefaultConnection"))); services.AddMvc(); }
连接字符串格式
User ID=root;Password=myPassword;Host=localhost;Port=5432;Database=myDataBase;Pooling=true;Min Pool Size=0;Max Pool Size=100;Connection Lifetime=0;
在Appsetting.json中增加连接字符串
"ConnectionStrings": { "DefaultConnection": "User ID=postgres;Password=wantgirl;Host=localhost;Database=postgres;Pooling=true;" },
创建数据库
工具 –> NuGet包管理器 –> 程序包管理器控制台
- Add-Migration MyFirstMigration
- Update-Database
创建MVC控制器
BlogsController.cs
using EFGetStarted.AspNetCore.NewDb.Models; using Microsoft.AspNetCore.Mvc; using System.Linq; namespace EFGetStarted.AspNetCore.NewDb.Controllers { public class BlogsController : Controller { private BloggingContext _context; public BlogsController(BloggingContext context) { _context = context; } public IActionResult Index() { return View(_context.Blogs.ToList()); } public IActionResult Create() { return View(); } [HttpPost] [ValidateAntiForgeryToken] public IActionResult Create(Blog blog) { if (ModelState.IsValid) { _context.Blogs.Add(blog); _context.SaveChanges(); return RedirectToAction("Index"); } return View(blog); } } }
创建视图
Index.cshtml
@model IEnumerable<EFGetStarted.AspNetCore.NewDb.Models.Blog> @{ ViewBag.Title = "Blogs"; } <h2>Blogs</h2> <p> <a asp-controller="Blogs" asp-action="Create">Create New</a> </p> <table class="table"> <tr> <th>Id</th> <th>Url</th> </tr> @foreach (var item in Model) { <tr> <td> @Html.DisplayFor(modelItem => item.BlogId) </td> <td> @Html.DisplayFor(modelItem => item.Url) </td> </tr> } </table>
Create.cshtml
@model EFGetStarted.AspNetCore.NewDb.Models.Blog @{ ViewBag.Title = "New Blog"; } <h2>@ViewData["Title"]</h2> <form asp-controller="Blogs" asp-action="Create" method="post" class="form-horizontal" role="form"> <div class="form-horizontal"> <div asp-validation-summary="All" class="text-danger"></div> <div class="form-group"> <label asp-for="Url" class="col-md-2 control-label"></label> <div class="col-md-10"> <input asp-for="Url" class="form-control" /> <span asp-validation-for="Url" class="text-danger"></span> </div> </div> <div class="form-group"> <div class="col-md-offset-2 col-md-10"> <input type="submit" value="Create" class="btn btn-default" /> </div> </div> </div> </form>