在開發過程中我們通常使用的是Db first這種模式,而在.net core 中推薦使用的卻是 code first 反正我是很不習慣這種開發模式
於是就搜尋整個微軟的官方文檔,終於找到了有關.net core 使用Db first 的教程,這里給出鏈接:https://docs.microsoft.com/zh-cn/ef/core/miscellaneous/cli/powershell
一.Db first
1.使用Db first 需要通過Nuget引用幾個依賴包
Microsoft.EntityFrameworkCore
Microsoft.EntityFrameworkCore.Tools
Microsoft.EntityFrameworkCore.SqlServer.Design
2.打開程序管理控制台
3.執行創建實體類的命令
Scaffold-DbContext -Connection "Server=.;Database=Company;uid=sa;pwd=123@qwe" Microsoft.EntityFrameworkCore.SqlServer -OutputDir "Models"
其中 --OutputDir <String > 要在其中放置文件的目錄。 路徑相對於項目目錄。
-Connection <String> 要在其中放置文件的目錄。 路徑相對於項目目錄。
-ContextDir <String > 要在其中放置 DbContext
文件的目錄。 路徑相對於項目目錄。
-Context <String> 名稱DbContext
類生成。
-Tables <String[]> 要為其生成實體類型的表。 如果省略此參數,則包括所有表。
當然我們也可以只生成選定的表,以及指定dbcontext上下文的路徑和名稱
Scaffold-DbContext "Server=.;Database=Company;uid=sa;pwd=123@qwe" Microsoft.EntityFrameworkCore.SqlServer -OutputDir Models -Tables "Blog","Post" -ContextDir Context -Context BlogContext
當對表有修改時,我們可以通過-Force 參數重新生成實體類
Scaffold-DbContext "Server=.;Database=Company;uid=sa;pwd=123@qwe" Microsoft.EntityFrameworkCore.SqlServer -OutputDir Models -Tables "Blog","Post" -ContextDir Context -Context BlogContext -Force
通過添加測試模型遇到的問題
解決方案:
在項目的Startup.cs的ConfigureServices方法中注冊生成的上下文
二.Code first(這種方式在官方文檔中有很多例子,在這里我借用官方文檔的實例來簡單介紹一下操作步驟)
1.通過Nuget安裝依賴包
Microsoft.EntityFrameworkCore
2.創建實體類
在 Models 文件夾中,創建 Enrollment.cs 和Course.cs並且用以下代碼替換現有代碼:
namespace ContosoUniversity.Models { public enum Grade { A, B, C, D, F } public class Enrollment { public int EnrollmentID { get; set; } public int CourseID { get; set; } public int StudentID { get; set; } public Grade? Grade { get; set; } public Course Course { get; set; } public Student Student { get; set; } } }
using System.Collections.Generic; using System.ComponentModel.DataAnnotations.Schema; namespace ContosoUniversity.Models { 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; } } }
3.創建數據庫上下文
在項目文件夾中,創建名為的文件夾 Data。
在 Data 文件夾創建名為 SchoolContext.cs 的類文件,並將模板代碼替換為以下代碼:
using ContosoUniversity.Models; using Microsoft.EntityFrameworkCore; namespace ContosoUniversity.Data { public class SchoolContext : DbContext { public SchoolContext(DbContextOptions<SchoolContext> options) : base(options) { } public DbSet<Course> Courses { get; set; } public DbSet<Enrollment> Enrollments { get; set; } public DbSet<Student> Students { get; set; } } }
4.注冊 SchoolContext
ASP.NET Core 默認實現 依賴注入。 在應用程序啟動過程通過依賴注入注冊相關服務 (例如 EF 數據庫上下文)。 需要這些服務的組件 (如 MVC 控制器) 可以通過向構造函數添加相關參數來獲得對應服務。 在本教程后面你將看到控制器構造函數的代 碼,就是通過上述方式獲得上下文實例。
若要將 SchoolContext
注冊為一種服務,打開 Startup.cs ,並將高亮代碼添加到 ConfigureServices
方法中。
public void ConfigureServices(IServiceCollection services) { services.Configure<CookiePolicyOptions>(options => { options.CheckConsentNeeded = context => true; options.MinimumSameSitePolicy = SameSiteMode.None; }); services.AddDbContext<SchoolContext>(options => options.UseSqlServer(Configuration.GetConnectionString("DefaultConnection"))); services.AddMvc(); }
打開 appsettings.json 文件,並如以下示例所示添加連接字符串 。
{ "ConnectionStrings": { "DefaultConnection": "Server=(localdb)\\mssqllocaldb;Database=ContosoUniversity1;Trusted_Connection=True;MultipleActiveResultSets=true" },
"Logging": { "IncludeScopes": false, "LogLevel": { "Default": "Warning" } } }
5.添加數據
在 Program.cs,修改 Main
方法,使得在應用程序啟動時能執行以下操作:
從依賴注入容器中獲取數據庫上下文實例。
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<SchoolContext>(); var courses = new Course[] { new Course{CourseID=1050,Title="Chemistry",Credits=3}, new Course{CourseID=4022,Title="Microeconomics",Credits=3}, new Course{CourseID=4041,Title="Macroeconomics",Credits=3}, new Course{CourseID=1045,Title="Calculus",Credits=4}, new Course{CourseID=3141,Title="Trigonometry",Credits=4}, new Course{CourseID=2021,Title="Composition",Credits=3}, new Course{CourseID=2042,Title="Literature",Credits=4} }; foreach (Course c in courses) { context.Courses.Add(c); } context.SaveChanges(); } catch (Exception ex) { var logger = services.GetRequiredService<ILogger<Program>>(); logger.LogError(ex, "An error occurred while seeding the database."); } } host.Run(); }