当前位置:   article > 正文

c#使用EntityFrameworkCore_c# entity framework core

c# entity framework core

IDE:VS2019

.Net版本:.Net Core3.1

数据库:Sqlite

1.创建一个.net core控制台的项目,并创建两个model,TeacherModel和StudentModel,其中主程序集引用Models程序集:

2.两个model都有名字和id等信息:

  1. public class TeacherModel
  2. {
  3. public int ID { set; get; }
  4. public string Name { set; get; }
  5. }
  6. public class StudentModel
  7. {
  8. public int ID { set; get; }
  9. public string Name { set; get; }
  10. }

3.通过NuGet安装两个包。

在Models安装:

在EntityFrameworkDemo安装:

4.添加一个Context类:

  1. public class InfoManagementContext: DbContext
  2. {
  3. public DbSet<StudentModel> Students { get; set; }
  4. public DbSet<TeacherModel> Teachers { get; set; }
  5. protected override void OnConfiguring(DbContextOptionsBuilder options)
  6. => options.UseSqlite("Data Source=info.db");
  7. }

5.进入到程序包管理控制台界面:

生成项目后执行下面两个命令:

执行成功后,会生成两个新内容,info.db和Migrations文件夹下的内容,其中Migrations在上线前一般可以随意删除,但是后期会涉及到数据迁移和数据库更新的问题,不建议删除,以防出现问题:

6.将info.db做下设置:

7.在Program添加一段测试代码:

  1. class Program
  2. {
  3. static void Main(string[] args)
  4. {
  5. var db = new InfoManagementContext();
  6. //新增
  7. db.Teachers.Add(new TeacherModel() { Name = "教师1" });
  8. db.Students.Add(new StudentModel() { Name = "学生1" });
  9. db.SaveChanges();//该方法默认情况下会封装到一个事务里面
  10. //读取
  11. var teacher = db.Teachers.OrderBy(x => x.ID).First();
  12. var student = db.Students.OrderBy(x => x.ID).First();
  13. //修改
  14. teacher.Name = "教师2";
  15. student.Name = "学生2";
  16. db.SaveChanges();
  17. //读取
  18. teacher = db.Teachers.OrderBy(x => x.ID).First();
  19. student = db.Students.OrderBy(x => x.ID).First();
  20. //删除
  21. db.Teachers.Remove(teacher);
  22. db.Students.Remove(student);
  23. db.SaveChanges();
  24. }
  25. }

8.生成代码并执行,使用sqlite工具观察数据库的info.db这个数据库的变化:

我用的sqlite工具是SQLiteStudio。

基本的使用流程大概就是如此,这里Migrations这个文件夹在生成了数据库之后是可以删除的。

有三个问题,需要解决:

1.主键问题,有单一主键和复合主键

单一主键只需要在属性上加特性[Key]或者重写DbContext就可以了:

  1. public class InfoManagementContext: DbContext
  2. {
  3. public DbSet<StudentModel> Students { get; set; }
  4. public DbSet<TeacherModel> Teachers { get; set; }
  5. protected override void OnConfiguring(DbContextOptionsBuilder options)
  6. => options.UseSqlite("Data Source=info.db");
  7. protected override void OnModelCreating(ModelBuilder modelBuilder)
  8. {
  9. modelBuilder.Entity<StudentModel>().HasKey(x => new { x.Key });
  10. base.OnModelCreating(modelBuilder);
  11. }
  12. }
  13. 或者
  14. public class StudentModel
  15. {
  16. [Key]
  17. public int Key { set; get; }
  18. public int ID { set; get; }
  19. public string Name { set; get; }
  20. public int TeacherID { set; get; }
  21. }

复合主键,则只能在重写OnModelCreating里面添加:

modelBuilder.Entity<StudentModel>().HasKey(x => new { x.Key, x.ID });

2.将不同的表放到不同的数据库里面。这个例子里面两张表都放到了一个库里面,如果有分库的需求,那么就多写一个DbContext,然后分别指定Context执行生成库操作:

  1. Add-Migration InitialCreate -Context InfoManagementContext
  2. Update-Database -Context InfoManagementContext

3.表更新问题。如果要给某张表增加一列,原本的数据不能删除,解决方法是使用Add-Migration的参数Update-Database,然后执行更新数据库的命令Update-Database:

文件夹下会多一个更新数据库的类:

这样,数据库就更新了。

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/Cpp五条/article/detail/253546
推荐阅读
相关标签
  

闽ICP备14008679号