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();
推荐阅读
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- 怎么帮朋友转发他的朋友圈(如何幽默的让别人帮你转发朋友圈)
- 如何在微信的朋友圈转发己发过的东西(微信怎么转发别人以前发的朋友圈)
- 新手应该如何玩王者荣耀(新手上王者需要多久)
- ipad如何下载刺激战场国际服(ipad从哪下载刺激战场国际服)
- 24 《吐血整理》高级系列教程-吃透Fiddler抓包教程-Fiddler如何优雅地在正式和测试环境之间来回切换-中篇
- 苹果手机如何设置语音通话铃声(苹果手机铃声开启方法)
- 用手机怎么发微信朋友圈(微信如何用手机发朋友圈)
- 抖音怎么跟自己合拍,抖音如何和自己合拍视频
- 微信聊天记录怎么恢复原来这么简单的啊(微信被误卸载了如何恢复聊天记录)
- 两个抖音号如何申请开直播(两个抖音号同时直播同一场景)