說明:搭建netcore 使用efcore入門教程,跟着這個教程,傻瓜都可以成功!O(∩_∩)O哈哈~,咱們開始吧;
首先介紹下環境:
vs2017,
netcore2.2,
EntityFramework6
測試場景:Mysql,SqlServer
一、創建netcore模板項目
這個就不用多說了,創建完成看下版本:
二、引用EF Core
有的博主寫的這樣引用:Install-Package Microsoft.EntityFrameworkCore.Sqlite –Pre
但是,遺憾的是,報錯了:
然后我自己引用了以包,OK
為了方便復制,我直接復制出來:
1.Microsoft.EntityFrameworkCore
2.Install-Package Microsoft.EntityFrameworkCore.Sqlite
3.Install-Package Microsoft.EntityFrameworkCore.Design
4.Install-Package Microsoft.EntityFrameworkCore.Tools
項目結構如下:
三、創新測試的實體類
我這邊創建了一個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; } }
四、創建一個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; } }
五、創建數據庫初始化和連接
為了方便測試,將數據庫連接配置放在了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();//數據庫不存在的話,會自動創建
六、打開對應文件目錄,執行
打開文件夾的命令行,
輸入
dotnet ef migrations add MyFirstMigration
dotnet ef database update
這樣我們就創建好了數據庫。更多命令請 dotnet ef -h
可以看到,里面其實是執行了創建數據庫表的sql語句!
那我,我們來看一下我數據庫,結果如下:
有的朋友可能會問,為啥多了一個表:“_efmigrationshistory”,故名思義,這個表示執行操作的記錄,因為可能對表增加字段,修改字段,刪除字段等等;
當然只是一個記錄:
運行完成之后,我們會發現,我們會多一個Migrations文件夾
里面的內容是什么呢,大家可以打開看看,下面是我的部分截圖:
可以看到,這些都是我們之前創建實體時的一些屬性,如果是第一次嘗試的朋友也沒有必要設置這么多。
七、測試效果
簡單寫了個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的東西,如有問題,歡迎一起討論。
感謝以下文章提供的啟發:
參考博客:https://www.cnblogs.com/liangxiaofeng/p/5806347.html
參考文檔:https://docs.microsoft.com/zh-cn/ef/core/get-started/netcore/new-db-sqlite