C#.NET ORM 如何访问 Access 数据库 [FreeSql]( 二 )

CRUD 模式二:仓储 + 工作单元FreeSql.Repository 作为扩展,实现了通用仓储层功能 。与其他规范标准一样,仓储层也有相应的规范定义 。FreeSql.Repository 参考 abp vnext 接口,定义和实现基础的仓储层(CURD),算比较通用的方法 。

  • Select/Attach 快照对象,Update 只更新变化的字段;
  • Insert 插入数据,适配各数据库优化执行 ExecuteAffrows/ExecuteIdentity/ExecuteInserted;
  • InsertOrUpdate 插入或更新;
  • SaveMany 方法快速保存导航对象(一对多、多对多);
  • 工作单元管理事务
//Startup.cspublic void ConfigureServices(IServiceCollection services){services.AddSingleton<IFreeSql>(DB.access);services.AddScoped<UnitOfWorkManager>();services.AddFreeRepository(null, typeof(Startup).Assembly);//批量注入 Service}public class SongService{readonly IBaseRepository<Song> _repoSong;readonly IBaseRepository<Detail> _repoDetail;public SongService(IBaseRepository<Song> repoSong, IBaseRepository<Detail> repoDetail){_repoSong = repoSong;_repoDetail = repoDetail;}[Transactional]public virtual void Test1(){//这里 _repoSong、_repoDetail 所有操作都是一个工作单元this.Test2();}[Transactional(Propagation = Propagation.Nested)]public virtual void Test2() //嵌套事务{//这里 _repoSong、_repoDetail 所有操作都是一个工作单元}}属性返回值说明EntityTypeType仓储正在操作的实体类型,注意它不一定是 TEntityUnitOfWorkIUnitOfWork正在使用的工作单元OrmIFreeSql正在使用的 OrmDbContextOptionsDbContextOptions正在使用的 DbContext 设置,修改设置不影响其他DataFilterIDataFilter<TEntity>仓储过滤器,本对象内生效UpdateDiyIUpdate<TEntity>准备更新数据,与仓储同事务SelectISelect<TEntity>准备查询数据方法返回值参数说明AsTypevoidType改变仓储正在操作的实体类型GetTEntityTKey根据主键,查询数据FindTEntityTKey根据主键,查询数据DeleteintTKey根据主键删除数据DeleteintLambda根据 lambda 条件删除数据DeleteintTEntity删除数据DeleteintIEnumerable<TEntity>批量删除数据DeleteCascadeByDatabaseList<object>Lambda根据导航属性递归数据库删除数据Insert-TEntity插入数据,若实体有自增列,插入后的自增值会填充到实体中Insert-IEnumerable<TEntity>批量插入数据Update-TEntity更新数据Update-IEnumerable<TEntity>批量更新数据InsertOrUpdate-TEntity插入或更新数据FlushState-无清除状态管理数据Attach-TEntity附加实体到状态管理,可用于不查询就更新或删除Attach-IEnumerable<TEntity>批量附加实体到状态管理AttachOnlyPrimary-TEntity只附加实体的主键数据到状态管理SaveMany-TEntity, string保存实体的指定 ManyToMany/OneToMany 导航属性(完整对比)BeginEdit-List<TEntity>准备编辑一个 List 实体EndEditint无完成编辑数据 , 进行保存动作
状态管理,可实现 Update 只更新变化的字段(不更新所有字段),灵活使用 Attach 和 Update 用起来非常舒服 。
CRUD 模式三:DbContextFreeSql.DbContext 实现类似 EFCore 使用习惯 , 跟踪对象状态,最终通过 SaveChanges 方法提交事务 。
FreeSql 可自动识别 EFCore 实体特性 Key/Required/NotMapped/MaxLength/StringLength/DatabaseGenerated/Table/Column 。
  • Select/Attach 快照对象,Update 只更新变化的字段;
  • Add/AddRange 插入数据,适配各数据库优化执行 ExecuteAffrows/ExecuteIdentity/ExecuteInserted;
  • AddOrUpdate 插入或更新;
  • SaveMany 方法快速保存导航对象(一对多、多对多);
using (var ctx = DB.oracle.CreateDbContext()) {//var db1 = ctx.Set<Song>();//var db2 = ctx.Set<Tag>();var item = new Song { };ctx.Add(item);ctx.SaveChanges();}// 或者```csharppublic class SongContext : DbContext {public DbSet<Song> Songs { get; set; }public DbSet<Tag> Tags { get; set; }protected override void OnConfiguring(DbContextOptionsBuilder builder) {builder.UseFreeSql(DB.oracle);}//每个 DbContext 只触发一次protected override void OnModelCreating(ICodeFirst codefirst){codefirst.Entity<Song>(eb =>{eb.ToTable("tb_song");eb.Ignore(a => a.Field1);eb.Property(a => a.Title).HasColumnType("varchar(50)").IsRequired();eb.Property(a => a.Url).HasMaxLength(100);}}}提示:FreeSql 兼容 EFCore 99% 的实体特性
CRUD 模式四:BaseEntityBaseEntity 是一种极简单的 CodeFirst 开发方式,特别对单表或多表CRUD,利用继承节省了每个实体类的重复属性(创建时间、ID等字段),软件删除等功能 , 进行 crud 操作时不必时常考虑仓储的使用;
dotnet add package FreeSql.Extensions.BaseEntity
public class UserGroup : BaseEntity<UserGroup, int>{public string GroupName { get; set; }}//添加var item = new UserGroup { GroupName = "组一" };item.Insert();//更新item.GroupName = "组二";item.Update();//添加或更新item.Save();//软删除item.Delete();//恢复软删除item.Restore();//根据主键获取对象var item = UserGroup.Find(1);//查询数据var items = UserGroup.Where(a => a.Id > 10).ToList();

推荐阅读