了解DbContext的作用及用法
DbContext是EFCore的入口类,我们所有对数据库的操作都是围绕DbContext完成的,可以说DbContext就是数据库和应用之间的纽带。但在实际使用中并不是直接newDbContext来使用的他。而是通过创建DbContext的子类,来使用他,这样做可以让不同的子类映射到不同的数据库,方便同时访问多个数据库,同时代码看起来也清晰易懂。
两个方法一类属性两个方法是:OnConfiguring和OnModelCreating,一类属性是:类型为DBSet的属性。相关的操作都是基于他们publicclassTestEFCoreDBContext:DbContext{publicTestEFCoreDBContext(DbContextOptionsTestEFCoreDBContextoptions):base(options){}protectedoverridevoidOnConfiguring(DbContextOptionsBuilderoptionsBuilder){各种配置在这里处理}protectedoverridevoidOnModelCreating(ModelBuildermodelBuilder){实体类和数据库表的映射在这里配置}对数据库表的操作都通过DbSetT类型的属性处理publicDbSetUserUserTable{get;set;}}
下面列出DbContext的基本用法
1。)设置要链接的数据库类型及链接字符串protectedoverridevoidOnConfiguring(DbContextOptionsBuilderoptionsBuilder)optionsBuilder。UseSqlServer(数据库连接字符串);其他类型的数据库连接可以看上一篇
2。)日志的相关配置输出ahrefhttps:www。bs178。comrizhitargetblankclassinfotextkey日志a到控制台protectedoverridevoidOnConfiguring(DbContextOptionsBuilderoptionsBuilder)optionsBuilder。LogTo(Console。WriteLine);输出ahrefhttps:www。bs178。comrizhitargetblankclassinfotextkey日志a到文件protectedoverridevoidOnConfiguring(DbContextOptionsBuilderoptionsBuilder)optionsBuilder。LogTo(logStream。WriteLine);
LogTo接受一个Action类型的委托,只要符合该签名的方法都可以,然后在方法中处理对应的日志信息就可以了。
3。)映射关系的配置protectedoverridevoidOnModelCreating(ModelBuildermodelBuilder){modelBuilder。EntityUser()。ToTable(UserTable)配置表名。HasKey(xx。Id);配置主键modelBuilder。EntityUser()。Property(xx。Name)。HasColumnName(FullName)配置字段名。HasColumnType(varchar);配置字段类型}
关系映射的配置有两种方式一种是FluentAPI,就是上面的方式,还有一种是数据注释的方式。
4。)添加DbSet类型的属性publicclassTestEFCoreDBContext:DbContext{publicDbSetUserUserTable{get;set;}publicDbSetStudentStudentTable{get;set;}}
对于数据库的操作都是基于这类属性,当DbContext的子类实例化的时候,DbContext会通过反射初始化DbSet类型的属性。
5。)实体对象状态的监测
有一个枚举类型publicenumEntityState,先看枚举类型的具体含义
Added
4hr该实体正由上下文跟踪,但数据库中尚不存在。
Deleted
2hr该实体正由上下文跟踪,并存在于数据库中。它已被标记为要从数据库中删除。
Detached
0hr上下文未跟踪实体。
Modified
3hr该实体正由上下文跟踪,并存在于数据库中。其部分或全部属性值已修改。
Unchanged
1hr该实体正由上下文跟踪,并存在于数据库中。其属性值与数据库中的值没有变化。
通过对这些实体对象的状态的跟踪,当调用SaveChanges会根据实体的状态来更新数据库。当然并不是所有的实体对象都会被跟踪,当出现以下情况时实体对象会被跟踪针对实体类的查询操作通过上下文调用Add、Attach、Update方法时