说明:搭建netcore 使用efcore入门教程,跟着这个教程,傻瓜均可以成功!O(∩_∩)O哈哈~,我们开始吧;html
首先介绍下环境:sql
vs2017,数据库
netcore2.2,json
EntityFramework6app
测试场景:Mysql,SqlServerpost
1、建立netcore模板项目学习
这个就不用多说了,建立完成看下版本:测试
2、引用EF Coreui
有的博主写的这样引用:Install-Package Microsoft.EntityFrameworkCore.Sqlite –Prespa
可是,遗憾的是,报错了:
而后我本身引用了以包,OK
为了方便复制,我直接复制出来:
1.Microsoft.EntityFrameworkCore
2.Install-Package Microsoft.EntityFrameworkCore.Sqlite
3.Install-Package Microsoft.EntityFrameworkCore.Design
4.Install-Package Microsoft.EntityFrameworkCore.Tools
项目结构以下:
3、创新测试的实体类
我这边建立了一个DBModel文件夹,而后分别建立了三个类:
OrderInfo.cs,
Passenger.cs,
Address.cs
为何要建立这么几个呢:由于后续会设计到表之间关联关系,主键,外键,引用等等,固然,本文主要是入门,后面的文章会详细讲解;
(PS:关系:一个OrderInfo有一个Passenger和一个Address,一个Passenger又能够有多个OrderInfo和一个Address);
强调:须要引用MySql.Data.EntityFrameworkCore
OrderInfo.cs
[MySqlCharset("utf8mb4")] //字符集,须要引用MySql.Data.EntityFrameworkCore [MySqlCollation("utf8mb4_general_ci")] //排序规则 [Table("orderinfo", Schema = "manager")] public class OrderInfo { [JsonProperty("id")] [Required] [Column("id", TypeName = "int(11)")] public int Id { get; set; } /// <summary> /// 订单Id /// </summary> [JsonProperty("order_id")] [Required] [Column("order_id", TypeName = "int(11)")] public int OrderId { get; set; } [JsonProperty("passengerid")] [Column("passenger_id",TypeName ="int(11)")] public int PassengerId { get; set; } [JsonProperty("addressid")] [Column("address_id", TypeName = "int(11)")] public int AddressId { get; set; } /// <summary> /// 订单价格 /// </summary> [StringLength(maximumLength: 100)] [Column("price")] public string Price { get; set; } /// <summary> /// 订单客人信息 /// </summary> [ForeignKey("PassengerId")] public Passenger OrderForPassenger { get; set; } ///// <summary> ///// 订单地址信息 ///// </summary> //[InverseProperty("OrderInfos")] //public Address OrderForAddress { get; set; }
Passenger.cs
[MySqlCharset("utf8mb4")] //字符集,须要引用MySql.Data.EntityFrameworkCore [MySqlCollation("utf8mb4_general_ci")] //排序规则 [Table("passenger", Schema = "manager")] public class Passenger { [JsonProperty("id")] [Column("id", TypeName = "int(10)")] public int Id { get; set; } [JsonProperty("passenger_id")] [Column("passengerid",TypeName ="int(11)")] public int PassengerId { get; set; } [JsonProperty("passengername")] public string PassengerName { get; set; } [InverseProperty("OrderForPassenger")] public List<OrderInfo> OrderInfos { get; set; } //[InverseProperty("Passengers")] //public Address PssengerForAddress { get; set; } }
Address.cs
[MySqlCharset("utf8mb4")] //字符集,须要引用MySql.Data.EntityFrameworkCore [MySqlCollation("utf8mb4_general_ci")] //排序规则 [Table("address", Schema = "manager")] public class Address { [JsonProperty("id")] [Required] public int Id { get; set; } [JsonProperty("province")] [StringLength(maximumLength: 256)] public string Province { get; set; } [JsonProperty("city")] [StringLength(maximumLength: 256)] public string City { get; set; } [JsonProperty("area")] [StringLength(maximumLength: 256)] public string Area { get; set; } [JsonProperty("street")] [StringLength(maximumLength:256)] public string Street { get; set; } }
4、建立一个DataDBContext.cs类,代码以下
public class DataDBContext:DbContext { public DataDBContext(DbContextOptions<DataDBContext> options) : base(options) { } /// <summary> /// 订单 /// </summary> public DbSet<OrderInfo> OrderInfos { get; set; } /// <summary> /// 乘客 /// </summary> public DbSet<Passenger> Passengers { get; set; } /// <summary> /// 地址 /// </summary> public DbSet<Address> Addresses { get; set; } }
5、建立数据库初始化和链接
为了方便测试,将数据库链接配置放在了appsettings.json文件中了。配置文件内容以下:
{ "Logging": { "LogLevel": { "Default": "Warning" } }, "AllowedHosts": "*", "ConnectionSetting": { "UserConnectionString": "server=localhost;userid=root;pwd=123456;port=3306;database=manager", "ReadConnectionString": "server=localhost;userid=root;pwd=123456;port=3306;database=manager", "DbType": 0 //数据库类型 } }
在StartUp.cs中注册链接:
services.AddDbContext<DataDBContext>(optionsBuilder => { var dataAppSetting = Configuration.GetSection("ConnectionSetting").Get<ConnectionSetting>(); if (dataAppSetting == null) { throw new Exception("未配置数据库链接"); } switch (dataAppSetting.DbType) { case 1: //server链接,EnableRetryOnFailure表示失败支持重试; optionsBuilder.UseSqlServer(dataAppSetting.UserConnectionString, option => option.EnableRetryOnFailure()); break; default: optionsBuilder.UseMySQL(dataAppSetting.UserConnectionString); break; } });
这里可能有朋友会问一下,万一数据库没有建立怎么办?
因此,这里Configure方法加一下内容
context.Database.EnsureCreated();//数据库不存在的话,会自动建立
6、打开对应文件目录,执行
打开文件夹的命令行,
输入
dotnet ef migrations add MyFirstMigration
dotnet ef database update
这样咱们就建立好了数据库。更多命令请 dotnet ef -h
看一下咱们的数据库数据:
运行完成以后,咱们会发现,咱们会多一个Migrations文件夹
里面的内容是什么呢,你们能够打开看看,下面是个人部分截图:
能够看到,这些都是咱们以前建立实体时的一些属性,若是是第一次尝试的朋友也没有必要设置这么多。
7、测试效果
简单写了个demo测试效果
话很少说,直接上代码:
Index.cshtml
@model IEnumerable<EfCoreDemo.DbModel.Address> @{ ViewBag.Title = "地址"; } <table class="table"> <tr> <th>Id</th> <th>省</th> <th>市</th> <th>区</th> <th>街道详细地址</th> </tr> @foreach (var item in Model) { <tr> <td> @Html.DisplayFor(modelItem => item.Id) </td> <td> @Html.DisplayFor(modelItem => item.Province) </td> <td> @Html.DisplayFor(modelItem => item.City) </td> <td> @Html.DisplayFor(modelItem => item.Area) </td> <td> @Html.DisplayFor(modelItem => item.Street) </td> </tr> } </table>
AddAddress.cshtml
@model EfCoreDemo.DbModel.Address @{ ViewData["Title"] = "Address"; } <form asp-controller="Address" asp-action="AddAddress" method="post"> <div class="form-group"> <label asp-for="Province" class="col-md-2 control-label">省:</label> <div class="col-md-10"> <input class="form-control" asp-for="Province" /> <span asp-validation-for="Province" class="text-danger"></span> </div> <label asp-for="City" class="col-md-2 control-label">市:</label> <div class="col-md-10"> <input class="form-control" asp-for="City" /> <span asp-validation-for="City" class="text-danger"></span> </div> <label asp-for="Area" class="col-md-2 control-label">区:</label> <div class="col-md-10"> <input class="form-control" asp-for="Area" /> <span asp-validation-for="Area" class="text-danger"></span> </div> <label asp-for="Street" class="col-md-2 control-label">街道门牌号:</label> <div class="col-md-10"> <input class="form-control" asp-for="Street" /> <span asp-validation-for="Street" class="text-danger"></span> </div> <div class="col-md-offset-2 col-md-10"> <input type="submit" value="保存" class="btn btn-success" /> </div> </div> </form>
AddressController.cs
public class AddressController : Controller
{
private DataDBContext _context;
public AddressController(DataDBContext context) {
_context = context;
}
public IActionResult Index()
{
return View(_context.Addresses.ToList());
}
public IActionResult AddAddress() {
return View();
}
[HttpPost]
[ValidateAntiForgeryToken]
public IActionResult AddAddress(Address address) {
if (ModelState.IsValid) {
_context.Addresses.Add(address);
_context.SaveChanges();
return RedirectToAction("Index");
}
return View(address);
}
运行效果:
至此,初级版本搭建成功,且运行成功;
后记:本文主要是记录一下netcore怎么搭建efcore,只属于基础,本身学习的过程当中也方便跟你们一块儿探讨,后续会继续更新更多的efcore的东西,若有问题,欢迎一块儿讨论。
感谢如下文章提供的启发:
参考博客:http://www.javashuo.com/article/p-tluwlcez-eo.html
参考文档:https://docs.microsoft.com/zh-cn/ef/core/get-started/netcore/new-db-sqlite