在.net core中数据操作的两种方式(Db first && Code first)
在开发过程中我们通常使用的是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(); }