首先,微软官方文档有对Entity Famework详细的描述和教程
链接: https://learn.microsoft.com/zh-cn/docs/
下面主要讲ASP.NET CORE中的Entity Famework如何部署和使用
.net控制台和winform窗体文件可以参考官方文档
添加DbContext
新建一个类,继承于DbContext,里面除了构造函数,需要添加DbSet,T是需要连接数据库映射的类
public class AppDbContext : DbContext
{
public AppDbContext(DbContextOptions<AppDbContext> options) : base(options)
{
}
public DbSet<Student> Students { get; set; }
}
安装程序包
根据自己的数据库,查看官网链接: https://learn.microsoft.com/zh-cn/ef/core/providers/?tabs=dotnet-core-cli,需要安装的NuGet包,需要注意.net的框架版本和包版本对应
appsettings配置中添加配置信息
{
······
"ConnectionStrings": {
"MysqlConnectString": "data source=127.0.0.1;port=3306; database=sys;user id=root;password=123456;pooling=true;charset=utf8"
}
}
新建仓储
仓储里面有个可读的AppDbContext,用来直接调用,获取数据库信息
其中四种函数方法代表了不同的获取信息和增删改查
1、获取就直接用linq语句调用AppDbContext里面的Students属性就行
2、如果新增和删除,除了Add(),还需要保存,用到SaveChanges()方法
3、如果更新,除了用到SaveChanges()方法,还需要把状态student.State设为 Microsoft.EntityFrameworkCore.EntityState.Modified
public class SQLStudentRepository : IStudentRepository
{
private readonly AppDbContext dbContext;
public SQLStudentRepository(AppDbContext dbContext)
{
this.dbContext = dbContext;
}
public Student GetStudent(int id)
{
var student = dbContext.Students.Find(id);
return student;
}
public IEnumerable<Student> GetStudents()
{
var students = dbContext.Students;
return students;
}
public Student AddStudent(Student student)
{
dbContext.Add(student);
dbContext.SaveChanges();
return student;
}
public Student UpdateStudent(Student updateStudent)
{
var student = dbContext.Students.Attach(updateStudent);
student.State = Microsoft.EntityFrameworkCore.EntityState.Modified;
dbContext.SaveChanges();
return updateStudent;
}
public Student DeleteStudent(int id)
{
Student student = dbContext.Students.Find(id);
if(student != null)
{
dbContext.Students.Remove(student);
dbContext.SaveChanges();
}
return student;
}
}
在启动类中添加DbContext的连接配置和依赖注入
public class Startup
{
private readonly IConfiguration _configuration;
public Startup(IConfiguration configuration)
{
_configuration = configuration;
}
public void ConfigureServices(IServiceCollection services)
{
string SQLString = _configuration.GetConnectionString("MysqlConnectString");
services.AddDbContextPool<AppDbContext>(
option => option.UseMySql(SQLString));
services.AddScoped<IStudentRepository, SQLStudentRepository>();
``````
}
public void Configure(IApplicationBuilder app, IWebHostEnvironment env)
{
``````
}
}
数据库迁移
目前有两种形式:
1、已经有数据库表,则不需要迁移这一步
2、如果没有数据库表,则需要迁移这一步
1、打开程序包管理器控制台
2、讲需要迁移的程序项目设为启动项目
3、程序包管理器控制台默认项目设为要迁移的项目
4、输入Add-Migration 名称,添加迁移的信息
项目里面就会添加下面文件夹,里面包含每次的迁移
5、输入Update-Database完成迁移
数据库会有一个两个表,一个是迁移的配置表,一个是迁移的表
以上为迁移最正常的流程,接下来介绍几个点
1、AppDbContextModelSnapshot文件,里面包含的是我们添加类到数据的一些属性配置信息
[DbContext(typeof(AppDbContext))]
partial class AppDbContextModelSnapshot : ModelSnapshot
{
protected override void BuildModel(ModelBuilder modelBuilder)
{
#pragma warning disable 612, 618
modelBuilder
.HasAnnotation("ProductVersion", "3.1.32")
.HasAnnotation("Relational:MaxIdentifierLength", 64);
modelBuilder.Entity("WebApplication3.Student", b =>
{
b.Property<int>("Id")
.ValueGeneratedOnAdd()
.HasColumnType("int");
b.Property<int>("ClassName")
.HasColumnType("int");
b.Property<string>("Email")
.IsRequired()
.HasColumnType("longtext CHARACTER SET utf8mb4");
b.Property<string>("Name")
.IsRequired()
.HasColumnType("varchar(50) CHARACTER SET utf8mb4")
.HasMaxLength(50);
b.HasKey("Id");
b.ToTable("Students");
});
#pragma warning restore 612, 618
}
}
2、20230330125520_mysql_first文件,里面包含我们up更新了什么内容,down删除了什么内容
public partial class mysql_first : Migration
{
protected override void Up(MigrationBuilder migrationBuilder)
{
migrationBuilder.CreateTable(
name: "Students",
columns: table => new
{
Id = table.Column<int>(nullable: false)
.Annotation("MySql:ValueGenerationStrategy", MySqlValueGenerationStrategy.IdentityColumn),
Name = table.Column<string>(maxLength: 50, nullable: false),
Email = table.Column<string>(nullable: false),
ClassName = table.Column<int>(nullable: false)
},
constraints: table =>
{
table.PrimaryKey("PK_Students", x => x.Id);
});
}
protected override void Down(MigrationBuilder migrationBuilder)
{
migrationBuilder.DropTable(
name: "Students");
}
}
3、如果只是Add-Migration还没有Update-Database完成迁移的时候,不想迁移了,就可以通过remove-migration来删除这一次的迁移添加
4、如果已经迁移,想退回某个点怎么办
比如如果想要从前文的20230410110657_mysql_second回滚到20230401060420_mysql_first_home,就需要输入Update-Database mysql_first_home,数据库就会更新归滚到mysql_first_home
旧数据配置表
新数据库表
Student表也进行的回退更新,但是文件夹里还在怎么办
直接输入remove-migration,即可删除之前的迁移
总结一下:
如果想要回滚到某个迁移,先用Update-Database 名称,回滚数据库,新增迁移都还能保留,如果想用某次迁移,再用一次Update-Database 名称。
如果后面的新增迁移都不想要了,再多次remove-migration,删除项目增加的迁移文件。
5、如果想在建表的时候添加原始数据怎么办
在AppDbContext添加代码,进行迁移即可
public class AppDbContext : DbContext
{
public AppDbContext(DbContextOptions<AppDbContext> options) : base(options)
{
}
protected override void OnModelCreating(ModelBuilder modelBuilder)
{
modelBuilder.Entity<Student>().HasData(
new Student
{
Id = 1,
Name = "小虎",
ClassName = ClassNameEnum.SecondGrade,
Email = "ads@qq.com"
});
}
public DbSet<Student> Students { get; set; }
}