asp.net core經過ef core來訪問數據庫,這裏用的是代碼優先,經過遷移來同步數據庫與模型。web
環境:vs2017,win10,asp.net core 2.1sql
1、從創建asp.net core web項目開始 數據庫
一、經過vs2017創建一個asp.net core web應用程序json
二、在models文件夾下面建立一個student類,這個類用做數據模型,表示的是數據庫裏面的student表 windows
public class Student { [DatabaseGenerated(DatabaseGeneratedOption.None)] public Guid ID { set; get; } [Required] [MaxLength(30)] public string Name { set; get; } public int Age { set; get; } public byte Sex { set; get; } public string Remark { set; get; } [DatabaseGenerated(DatabaseGeneratedOption.Identity)] public DateTime CreateDate { set; get; } [DatabaseGenerated(DatabaseGeneratedOption.Computed)] public DateTime LastUpdate { set; get; } }
關於表裏面的特性說明這裏暫時無論,等建立了數據庫後再來講明。mvc
三、建立數據庫上下文app
在項目中創建一個Data文件夾,建立一個類SqlServerContextasp.net
public class SqlServerContext : DbContext { public SqlServerContext(DbContextOptions<SqlServerContext> options) : base(options) { } public DbSet<Student> Students { get; set; } protected override void OnModelCreating(ModelBuilder modelBuilder) { modelBuilder.Entity<Student>().ToTable("Student"); } }
在 Entity Framework 中,實體集一般與數據表相對應,具體實體與表中的行相對應。當數據庫建立完成後, EF 建立一系列數據表,表名默認和 DbSet
屬性名相同。但能夠在OnModelCreating方法中指定表名。ide
四、註冊數據庫上下文工具
打開 Startup.cs,在ConfigureServices方法中添加以下代碼
services.AddDbContext<SqlServerContext>(options => options.UseSqlServer(Configuration.GetConnectionString("SqlServerContext")));
SqlServerContext是數據庫字符串的名稱。打開appsettings.json 文件,並如如下示例所示添加鏈接字符串。
"ConnectionStrings": { "SqlServerContext": "Server=(localdb)\\ProjectsV84;Database=TestDB1;Trusted_Connection=True;MultipleActiveResultSets=true" }
這裏鏈接的是本地數據庫,數據庫的驗證方式是windows驗證。
五、遷移
經過命令行接口 (CLI)執行遷移命令來實現遷移,在此以前,須要按照適用於命令行接口 (CLI) 的 EF 工具。 注意: 必須經過編輯 .csproj 文件來安裝此包;不能使用 install-package
命令或包管理器 GUI。
若要編輯 .csproj 文件,可右鍵單擊解決方案資源管理器中的項目名稱,而後選擇「編輯EFCoreDB.csproj」,在ItemGroup裏面添加以下代碼
<DotNetCliToolReference Include="Microsoft.EntityFrameworkCore.Tools.DotNet" Version="2.0.0" /> <DotNetCliToolReference Include="Microsoft.VisualStudio.Web.CodeGeneration.Tools" Version="2.0.0" />
在項目所在的文件夾下打開cmd窗口,執行命令:dotnet ef migrations add CreateDB
命令執行成功的話,會在項目中添加一個文件夾Migrations
這裏面的兩個文件就是EF如何建立數據庫的,通常來講不須要手動去修改這兩個文件。
這時候,數據庫裏面尚未相應的數據庫和表
在cmd中執行命令dotnet ef database update,成功執行後,就能夠在數據庫裏面看到建立的數據庫和表了
六、分析
如今來看看student表的列和模型student的關係
系統默認ID是主鍵,這是一種約定,固然也能夠在模型student的ID屬性上用 [
模型中,ID的類型是guid,在數據庫裏面就對應類型uniqueidentifier,[DatabaseGenerated(DatabaseGeneratedOption.None)]特性表示ID列不須要數據庫自動添加值。
Name和Remark都是string類型,remark沒有任何修飾,因此數據庫中的類型就是nvarchar(max),且能夠爲空。
七、步驟優化
上面的的6個步驟中,第3,4兩步能夠不用手動添加。能夠經過新搭建基架的項目命令來完成。
先完成上面的1,2兩個步驟,而後在Controllers文件夾上右鍵==》添加==》新搭建基架的項目
在模型類中選擇第二步添加的模型student,數據上下文類中,點擊後面的+號,將名稱改成sqlserver,其餘的默認就行,最後點擊添加。系統會自動的建立數據上下文,而且還幫你註冊了,除此以外,還添加了students控制器和相應的視圖,對於控制器和視圖能夠保留,也能夠刪掉。剩下的須要修改一下配置文件中數據庫的鏈接字符串,而後接着第五步繼續就能夠了。
2、當模型修改或者添加新的模型後
一、修改模型student,添加一個學號字段code;添加模型course,每一個學生能夠報多個課程,每一個課程能夠有多個學生報名,所以student和course是多對多的關係,須要一箇中間表來關聯,因此添加模型Enrollment。修改後的模型以下:
public class Student { [DatabaseGenerated(DatabaseGeneratedOption.None)] public Guid ID { set; get; } [Required] [MaxLength(30)] public string Name { set; get; } [Required] [MaxLength(30)] public string Code { set; get; } public int Age { set; get; } public byte Sex { set; get; } public string Remark { set; get; } [DatabaseGenerated(DatabaseGeneratedOption.Identity)] public DateTime CreateDate { set; get; } [DatabaseGenerated(DatabaseGeneratedOption.Computed)] public DateTime LastUpdate { set; get; } public ICollection<Enrollment> Enrollments { get; set; } } public class Enrollment {
public int EnrollmentID { get; set; } public int CourseID { get; set; } public Guid StudentID { get; set; } public Grade? Grade { get; set; } public Course Course { get; set; } public Student Student { get; set; } } public enum Grade { A, B, C, D, F } public class Course { [DatabaseGenerated(DatabaseGeneratedOption.None)] public int CourseID { get; set; } public string Title { get; set; } public int Credits { get; set; } public ICollection<Enrollment> Enrollments { get; set; } }
修改數據上下文
public class SqlServerContext : DbContext { public SqlServerContext(DbContextOptions<SqlServerContext> options) : base(options) { } protected override void OnModelCreating(ModelBuilder modelBuilder) { modelBuilder.Entity<Student>().ToTable("Student"); modelBuilder.Entity<Course>().ToTable("Course"); modelBuilder.Entity<Enrollment>().ToTable("Enrollment"); } public DbSet<Student> Students { get; set; } public DbSet<Enrollment> Enrollments { get; set; } public DbSet<Course> Courses { get; set; } }
二、遷移
執行這個命令後,在Migrations文件夾中添加了20190329030918_AddTable.cs文件,裏面的內容就是關於模型的修改的一些代碼
繼續執行命令dotnet ef database update
完過後,數據庫中表已經正常添加了
經過上面的方式,在student表中添加了列code,新建的表Enrollment中有主鍵和外鍵。固然也能夠不用設置外鍵,直接將表Enrollment的CourseID和StudentID設置爲複合主鍵。這樣的話,模型student中就不須要導航屬性StudentID(Course,Enrollment中也是如此)。同時數據上下文中須要指定Enrollment表的複合主鍵:
modelBuilder.Entity<Enrollment>().ToTable("Enrollment").HasKey(c=>new { c.StudentID,c.CourseID});
這樣一來,Enrollment中的EnrollmentID也要去掉。設置複合主鍵只能是在數據上下文中設置。
3、爲數據庫添加初始數據
在數據庫中,有些表是有初始數據的,能夠經過sql語句導入,在這裏經過程序來實現吧
打開Program.cs文件,修改後:
public class Program { public static void Main(string[] args) { var host = CreateWebHostBuilder(args).Build(); using (var scope = host.Services.CreateScope()) { var services = scope.ServiceProvider; try { var context = services.GetRequiredService<SqlServerContext>(); Initialize(context); } catch (Exception ex) { var logger = services.GetRequiredService<ILogger<Program>>(); logger.LogError(ex, "An error occurred while seeding the database."); } } host.Run(); } public static IWebHostBuilder CreateWebHostBuilder(string[] args) => WebHost.CreateDefaultBuilder(args) .UseStartup<Startup>(); private static void Initialize(SqlServerContext context) { if (!context.Courses.Any()) { var courses = new Course[] { new Course{CourseID=1050,Title="數學",Credits=3}, new Course{CourseID=4022,Title="語文",Credits=3}, new Course{CourseID=4041,Title="英語",Credits=3}, new Course{CourseID=1045,Title="化學",Credits=4}, new Course{CourseID=3141,Title="生物",Credits=4}, new Course{CourseID=2021,Title="物理",Credits=3}, new Course{CourseID=2042,Title="體育",Credits=4} }; foreach (Course c in courses) { context.Courses.Add(c); } context.SaveChanges(); } } }
運行程序,數據就會添加到數據庫了。
4、數據庫表裏面有數據的狀況下修改表結構
這裏的修改確定是合理的修改,不能說你將字符串的列改爲了數字的列。這裏試驗一下添加新的列,不能爲空的
一、在course模型中,添加一個非空的字段
二、遷移
執行完遷移的第一個命令後,打開系統添加的文件,找到Up方法
能夠看到up方法裏面只有影響修改的部分,要設置一個非空列的初始值,就須要在這裏改代碼了,改好了以後執行遷移的第二個命令。查詢數據庫,表結構已經更改,並且裏面的數據也沒有丟失。
關於EF CORE的應用的基本介紹就到這裏,更深刻的學習仍是參考微軟官方文檔吧