赞
踩
IDE:VS2019
.Net版本:.Net Core3.1
数据库:Sqlite
1.创建一个.net core控制台的项目,并创建两个model,TeacherModel和StudentModel,其中主程序集引用Models程序集:
2.两个model都有名字和id等信息:
- public class TeacherModel
- {
- public int ID { set; get; }
- public string Name { set; get; }
- }
-
- public class StudentModel
- {
- public int ID { set; get; }
- public string Name { set; get; }
- }
3.通过NuGet安装两个包。
在Models安装:
在EntityFrameworkDemo安装:
4.添加一个Context类:
- public class InfoManagementContext: DbContext
- {
- public DbSet<StudentModel> Students { get; set; }
- public DbSet<TeacherModel> Teachers { get; set; }
-
- protected override void OnConfiguring(DbContextOptionsBuilder options)
- => options.UseSqlite("Data Source=info.db");
- }
5.进入到程序包管理控制台界面:
生成项目后执行下面两个命令:
执行成功后,会生成两个新内容,info.db和Migrations文件夹下的内容,其中Migrations在上线前一般可以随意删除,但是后期会涉及到数据迁移和数据库更新的问题,不建议删除,以防出现问题:
6.将info.db做下设置:
7.在Program添加一段测试代码:
- class Program
- {
- static void Main(string[] args)
- {
- var db = new InfoManagementContext();
- //新增
- db.Teachers.Add(new TeacherModel() { Name = "教师1" });
- db.Students.Add(new StudentModel() { Name = "学生1" });
- db.SaveChanges();//该方法默认情况下会封装到一个事务里面
- //读取
- var teacher = db.Teachers.OrderBy(x => x.ID).First();
- var student = db.Students.OrderBy(x => x.ID).First();
- //修改
- teacher.Name = "教师2";
- student.Name = "学生2";
- db.SaveChanges();
- //读取
- teacher = db.Teachers.OrderBy(x => x.ID).First();
- student = db.Students.OrderBy(x => x.ID).First();
- //删除
- db.Teachers.Remove(teacher);
- db.Students.Remove(student);
- db.SaveChanges();
- }
- }
8.生成代码并执行,使用sqlite工具观察数据库的info.db这个数据库的变化:
我用的sqlite工具是SQLiteStudio。
基本的使用流程大概就是如此,这里Migrations这个文件夹在生成了数据库之后是可以删除的。
有三个问题,需要解决:
1.主键问题,有单一主键和复合主键
单一主键只需要在属性上加特性[Key]或者重写DbContext就可以了:
- public class InfoManagementContext: DbContext
- {
- public DbSet<StudentModel> Students { get; set; }
- public DbSet<TeacherModel> Teachers { get; set; }
-
- protected override void OnConfiguring(DbContextOptionsBuilder options)
- => options.UseSqlite("Data Source=info.db");
-
- protected override void OnModelCreating(ModelBuilder modelBuilder)
- {
- modelBuilder.Entity<StudentModel>().HasKey(x => new { x.Key });
- base.OnModelCreating(modelBuilder);
- }
- }
-
- 或者
-
- public class StudentModel
- {
- [Key]
- public int Key { set; get; }
- public int ID { set; get; }
- public string Name { set; get; }
- public int TeacherID { set; get; }
- }
复合主键,则只能在重写OnModelCreating里面添加:
modelBuilder.Entity<StudentModel>().HasKey(x => new { x.Key, x.ID });
2.将不同的表放到不同的数据库里面。这个例子里面两张表都放到了一个库里面,如果有分库的需求,那么就多写一个DbContext,然后分别指定Context执行生成库操作:
- Add-Migration InitialCreate -Context InfoManagementContext
-
- Update-Database -Context InfoManagementContext
3.表更新问题。如果要给某张表增加一列,原本的数据不能删除,解决方法是使用Add-Migration的参数Update-Database,然后执行更新数据库的命令Update-Database:
文件夹下会多一个更新数据库的类:
这样,数据库就更新了。
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。