发布:2021/7/5 10:52:37作者:管理员 来源:本站 浏览次数:1646
要在C# code和数据库之间建立映射关系,EF提供了两种方式:
我们用entity来称呼所有需要被持久化的对象,比如:
public class Student { public int Id { get; set; } //或者:public int StudentId { get; set; } public string Name { get; set; } }
注意:每一个Entity都应该有一个Key定义/辨别该Entity,EF默认使用属性名为 Id 或 类名+Id 的属性作为 Key。否则后面会报错。
这两个对象是EF的核心对象。使用他们首先需要引入相应的EF类库。使用NuGet添加:
开发人员需要自己创建一个类来继承DbContext
public class SqlDbContext : DbContext //继承还是组合? { //注意这里:不能是字段,不能是字段,不能是字段啊! public DbSet<Student> Students { set; get; } //EF据此确定哪些class需要映射到数据库 }
然后,通过声明/添加DbSet<E>属性,告知EF哪些entity需要被持久化。
EF core需要在DbContext子类中override OnConfiguring()方法,指定数据库:
protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder) { string connectionString = @"Data Source=(localdb)\MSSQLLocalDB;Initial Catalog=17bang;Integrated Security=True;"; //UseSqlServer()需要添加NuGet引用:Microsoft.EntityFrameworkCore.SqlServer optionsBuilder.UseSqlServer(connectionString); }
EF通过provider的形式支持多种数据库,详见:Database Providers
为了适配SQL Server,还需要安装dll:
Microsoft.EntityFrameworkCore.SqlServer
事实上,如果愿意的话,你甚至可以使用自定义的provider来支持任意数据存储方式……
可以根据DbContext中指定的entity,自动建表。
为了使用EF Migrations工具,我们还需要在起始项目中引入dll:(ASP.NET Core version 2.1后版本已自动安装)
Microsoft.EntityFrameworkCore.Tools
然后,在VS中打开 Package Manager Console(Tools > NuGet Package Manager > Package Manager Console)
输入:GET-HELP about_EntityFrameworkCore
显示以下内容,表明Migration Tool安装成功
如果操作系统是windows7,可能还需要额外的安装相应的.NET Framework/Core
注意指定好:
Migration会:
将entity映射成相应的表结构。
成功运行命令:Add-Migration <name>之后(<name>由开发人员指定,注意要有意义),
EF在DbContext所在项目生成一个文件夹Migrations:
以及两种类文件:
ModelSnapshot(快照):记录的是当前EF的映射情况
演示:读懂上述类文件代码
//Student中添加一行Age public int Age { get; set; }
我们就可以再执行一次Add-Migration。
每执行一次Add-Migration,就会
仅仅执行Add-Migration,数据库不会变化(演示)
执行Update-Database命令,才会利用Migrations文件夹下内容,同步数据库表结构。
演示:检查数据库,可以看到
该表由Migration自动生成并维护。
顾名思义,_MigrationHistory记录了和Migration的历史。
这样,当执行Update-Database命令时,EF会对比表_MigrationHistory和C#项目中的Migrations文件夹,决定需要执行的Migration
项目开发中,我们会:
所以,Migration被设计成可以
增量更新,不丢失数据
可以使用命令行和API完成
正是有了上述文件,在Update-Database时我们可以指定“版本号”,形成“回退/前进”效果:
思考:为什么需要数据库里的_EFMigrationsHistory?
Remove-Migration
删除(不是revert)“最近”(注意只能是最近)的一次migration,表现为:<datetime_stamp><migration_name>.cs同时被删除
(演示:略)
每一次变更都可以需要Add-Migration和。
,数据库也应该进行相应的变更。
Script-Migration
生成sql代码,常用于部署。可使用参数:
生成的SQL只包含_EFMigrationHistory数据。
(演示:略)
使用(C#)API
//Database属性从何而来? var db = new DBUserRepository().Database; //类似于Update-Database: apply all pending migrations //本身不生成Migrations db.Migrate();
EnsureCreated()建立的数据库没有__EFMigrationsHistory表,所以不能再使用Migration。
API的好处是可以建库删库:
//Enusure:存在才删除,不存在才创建 db.EnsureDeleted(); //Create数据库的同时建立表结构, db.EnsureCreated();
public Student Save(Student student) { Students.Add(student); SaveChanges(); return student; } public Student GetByName(string name) { return Students .Where(u => u.Name == name) .SingleOrDefault(); }
将User类映射到数据库:
Migration之后,在User类上添加一列:int FailedTry(尝试登陆失败次数),使用Migration工具:
© Copyright 2014 - 2024 柏港建站平台 ejk5.com. 渝ICP备16000791号-4