环境
VisualStudio
最新版本的.NETCore2.0SDK
最新版本的WindowsPowerShell
开始搭建1、在VisualStudio中创建新项目
“文件”“新建”“项目”
从左侧菜单中选择“已安装”“模板”“VisualC#”“.NETCore”。
选择“ASP.NETCoreWeb应用程序”。
输入“EFGetStarted.AspNetCore.NewDb”作为名称,然后单击“确定”。
在“新建ASP.NETCoreWeb应用程序”对话框中:
确保在下拉列表中选择“.NETCore”和“ASP.NETCore2.0”选项
选择“Web应用程序(模型视图控制器)”项目模板
确保将“身份验证”设置为“无身份验证”
单击“确定”
2、安装EntityFrameworkCore
工具”“NuGet包管理器”“包管理器控制台”
1.1、安装数据库提供程序
MsSql
运行:Install-PackageMicrosoft.EntityFrameworkCore.SqlServer
MySql
运行:柚子:Install-PackagePomelo.EntityFrameworkCore.MySql或者官方:Install-PackageMySql.Data.EntityFrameworkCore-Version8.0.11
1.2、安装程序包管理器控制台运行:Install-PackageMicrosoft.EntityFrameworkCore.Tools
1.3、安装设计包运行:Install-PackageMicrosoft.EntityFrameworkCore.Design
数据据库提供程序设计包 (EFCore2.0不再需要)MsSql
运行:Install-PackageMicrosoft.EntityFrameworkCore.SqlServer.DesignMySql
运行:Install-PackagePomelo.EntityFrameworkCore.MySql.Design
DBFirst——从现有数据库创建模型
MySql
运行:Scaffold-DbContext-Connection"Server=localhost;UserId=root;Password=;Database=vanfj"-Provider"Pomelo.EntityFrameworkCore.MySql"-OutputDir"Models"
MsSql
运行:Scaffold-DbContext-Connection"Server=localhost;UserId=root;Password=;Database=vanfj"-Provider"Microsoft.EntityFrameworkCore.SqlServer"-OutputDir"Models"
使用说明:将Connection中的连接字符串替换为自己的数据库连接,将OutputDir中的Models替换为自己要生成的文件目录名
CodeFirst——从模型生成到数据库
1、创建模型
1.1、创建上下文
publicclassSchoolContext:DbContext
{
publicSchoolContext(DbContextOptionsSchoolContextoptions):base(options)
{
}
publicDbSetCourseCourses{get;set;}
publicDbSetEnrollmentEnrollments{get;set;}
publicDbSetStudentStudents{get;set;}
protectedoverridevoidOnModelCreating(ModelBuildermodelBuilder)
{
modelBuilder.EntityCourse().ToTable("Course");
modelBuilder.EntityEnrollment().ToTable("Enrollment");
modelBuilder.EntityStudent().ToTable("Student");
}
}
publicclassStudent
{
publicintID{get;set;}
publicstringLastName{get;set;}
publicstringFirstMidName{get;set;}
publicDateTimeEnrollmentDate{get;set;}
publicICollectionEnrollmentEnrollments{get;set;}
}
publicenumGrade
{
A,B,C,D,F
}
publicclassEnrollment
{
publicintEnrollmentID{get;set;}
publicintCourseID{get;set;}
publicintStudentID{get;set;}
publicGrade?Grade{get;set;}
publicCourseCourse{get;set;}
publicStudentStudent{get;set;}
}
{
A,B,C,D,F
}
publicclassEnrollment
{
publicintEnrollmentID{get;set;}
publicintCourseID{get;set;}
publicintStudentID{get;set;}
publicGrade?Grade{get;set;}
publicCourseCourse{get;set;}
publicStudentStudent{get;set;}
}
publicclassCourse
{
[DatabaseGenerated(DatabaseGeneratedOption.None)]
publicintCourseID{get;set;}
publicstringTitle{get;set;}
publicintCredits{get;set;}
publicICollectionEnrollmentEnrollments{get;set;}
}
1.2、Startup文件注入上下文
EFCore在版本2.0中,引入了一种在依赖关系注入中注册自定义DbContext类型的新方法,即以透明形式引入可重用DbContext实例的池。要使用DbContext池,请在服务注册期间使用AddDbContextPool而不是AddDbContext
publicvoidConfigureServices(IServiceCollectionservices)
{
services.AddDbContextPoolSchoolContext(options=
options.UseMySql(Configuration.GetConnectionString("DefaultConnection")));
services.AddMvc().AddJsonOptions(options=
options.SerializerSettings.ReferenceLoopHandling=Newtonsoft.Json.ReferenceLoopHandling.Ignore);
}
1.3、appsettings.json文件添加连接字符串
{
"ConnectionStrings":{
"DefaultConnection":"Server=localhost;UserId=root;Password=;Database=vanfj"
},
"Logging":{
"IncludeScopes":false,
"LogLevel":{
"Default":"Warning"
}
}
}
2、执行NuGet命令,创建数据库
2.1、为迁移搭建基架
运行:Add-MigrationInitialCreate
2.2、将新迁移应用到数据库
运行:Update-Database
EFCore2.0NuGet命令
Get-Helpabout_EntityFrameworkCore获取EFCore命令帮助
添加一个迁移数据库迁移的名称目录(及其子命名空间)路径是相对于项目目录。默认值为"Migrations"。Add-Migration-NameString-OutputDirString Add-MigrationInitialCreate第一次执行初始化用这个
删除上次的迁移数据库不检查以查看迁移是否已应用到数据库。Remove-Migration-Force
目标迁移。如果为"0",将恢复所有迁移。默认到最后一个迁移。Update-DatabaseUpdate-DatabaseLastGoodMigration还原迁移
删除数据库显示的数据库会被丢弃,但没有删除它Drop-Database-WhatIf
Get-DbContext获取有关DbContext类型的信息
从数据库更新DbContext和实体的类型Scaffold-DbContext-ConnectionString 数据库的连接字符串。-ProviderString 要使用的提供程序。(例如Microsoft.EntityFrameworkCore.SqlServer)-OutputDirString 要将文件放入的目录。路径是相对于项目目录。--ContextString 若要生成的dbcontext名称。-SchemasString[] 要生成实体类型的表架构。-TablesString[] 要生成实体类型的表。-DataAnnotations 使用属性来配置该模型(如果可能)。如果省略,则使用仅fluentAPI。-UseDatabaseNames 使用直接从数据库表和列名称。-Force覆盖现有文件。
从迁移中生成的SQL脚本Script-Migration-FromString 开始迁移。默认值为0(初始数据库)-ToString 结束的迁移。默认到最后一个迁移-Idempotent 生成可以在任何迁移的数据库使用的脚本-OutputString 要将结果写入的文件
原文