Saving Data
数据可以通过实体进行创建、删除和修改
Base Save
1) 添加实体数据
通过DbContext.DbSet<TEntity>.add方法添加一个实体对象数据,当调用Savechanges()将数据保存到数据库中,如下:
2) 更新实体数据
在EF CORE中的DbContext对象都会有变化追踪器,用来追踪实体的数据变化。所以默 情况下,只要更改实体对象的数据,然后调用Savechanges()就会自动更新到数据库
在实际应用中有多种方式来进行数据更新,当只更新实体的某个属性时,推荐使用Attach()方法,在用save保存;当更新整个实体内容时,则使用EntityState.Modified属性来修改更加合适。
3) 删除实体数据
通过DbContext.DbSet<TEntity>.remove方法移除一个实体对象数据,若实体存在则调用Savechanges()后将从数据库删除实体数据;若实体不存在,则不会做任何操作。
级联删除操作(Cascade Delete),级联操作是主体和依赖体之间通过级联操作删除一方,则另一方也将会删除。级联分为三种操作分别如下:
Casecade:当主体被删除时,依赖实体将会同样被删除
SetNull: 当主体被删除时,依赖体中的外检属性将设置为null
Restrict:当主体被删除时,删除操作不应用在依赖实体中
Related Data(关联导航属性)
- 添加一个新实体到关联属性也添加:如下在创建Blog实体的同时也创建导航属性Post
- 新增一个实体导航属性存在
- 改变关系:改变现在所关联的导航属性
- 移除关系
Cascade Delete (级联删除)
有三种方式控制当主体实体删除,依赖实体是否删除的删除操作。
ü Cascade:依赖实体将跟随主体删除,即主体实体删除,则依赖实体也删除
ü SetNull:在依赖实体中将外键属性设置为空,即主体实体删除,则依赖实体不删除
ü Restrict:依赖实体不收主体删除的影响
Concurrency Conflicts(并发冲突)
EF Core中有三种值可以帮助处理并发冲突,分别是:
- Current Values(当前值):表示即将写入到数据库中的数据
- Original Values(原始值):在没有任何编辑的情况下从数据库检索的值
- Database Values(数据库值):目前存储在数据库中的值
解决并发冲突情况是通过捕获SaveChanges()的DbupdateConcurrencyException异常,然后在异常中轮询Entries找到以上三个值进行处理。
Transactions
事务处理允许服务器数据库以原子的方式处理数据,当事务提交后(Commit),表示成功执行所有操作,但是若其中一个未执行,则将会将所有的操作还原(Rollback)。在EF Core默认情况下当执行SaveChanges()进行插入、更新或删除数据库操作,实际后台是执行一个事务中的运行,且本次事务会执行足够长时间来完成。但是有时候 SaveChanges()的事务操作是远远不够的,所以需要手工配置事务如下:
l 分享连接和事务处理
有的时候在多个数据提供者存在的情况下,需要共用一个事务操作,则可以采用如下:
l 使用扩张的DbTransactions(仅仅关系数据库)
当存在多个数据技术同时使用,有可能会使用同一个数据库事务