FreeSql.DbContext 實作類似 EFCore 使用方法,跟蹤對象狀态,最終通過 SaveChanges 方法送出事務。
目前是第二個初版,已實作狀态跟蹤儲存(導航屬性的跟蹤暫時不支援)。
另外還缺少 rowversion 行鎖機制,這個現實好就可以在項目中使用了。
安裝
dotnet add package FreeSql.DbContext
如何使用
1、在 OnConfiguring 方法上配置與 IFreeSql 關聯。
說明:DbContext、DbSet 是 FreeSql 命名空間下的類。
public class SongContext : DbContext {
public DbSet<Song> Songs { get; set; }
public DbSet<Song> Tags { get; set; }
protected override void OnConfiguring(DbContextOptionsBuilder builder) {
builder.UseFreeSql(dbcontext_01.Startup.Fsql);
}
}
public class Song {
[Column(IsIdentity = true)]
public int Id { get; set; }
public DateTime? Create_time { get; set; }
public bool? Is_deleted { get; set; }
public string Title { get; set; }
public string Url { get; set; }
public virtual ICollection<Tag> Tags { get; set; }
}
public class Song_tag {
public int Song_id { get; set; }
public virtual Song Song { get; set; }
public int Tag_id { get; set; }
public virtual Tag Tag { get; set; }
}
public class Tag {
[Column(IsIdentity = true)]
public int Id { get; set; }
public int? Parent_id { get; set; }
public virtual Tag Parent { get; set; }
public decimal? Ddd { get; set; }
public string Name { get; set; }
public virtual ICollection<Song> Songs { get; set; }
public virtual ICollection<Tag> Tags { get; set; }
}
使用的時候與 EFCore 類似:
long id = 0;
using (var ctx = new SongContext()) {
var song = new Song { };
await ctx.Songs.AddAsync(song);
id = song.Id;
var adds = Enumerable.Range(0, 100)
.Select(a => new Song { Create_time = DateTime.Now, Is_deleted = false, Title = "xxxx" + a, Url = "url222" })
.ToList();
await ctx.Songs.AddRangeAsync(adds);
for (var a = 0; a < adds.Count; a++)
adds[a].Title = "dkdkdkdk" + a;
ctx.Songs.UpdateRange(adds);
ctx.Songs.RemoveRange(adds.Skip(10).Take(20).ToList());
//ctx.Songs.Update(adds.First());
adds.Last().Url = "skldfjlksdjglkjjcccc";
ctx.Songs.Update(adds.Last());
//throw new Exception("復原");
await ctx.SaveChangesAsync();
}
2、注入方式使用
public void ConfigureServices(IServiceCollection services)
{
services.AddSingleton<IFreeSql>(Fsql);
services.AddFreeDbContext<SongContext>(options => options.UseFreeSql(Fsql));
}
在 mvc 中擷取:
IFreeSql _orm;
public ValuesController(SongContext songContext) {
}
優先級
OnConfiguring > AddFreeDbContext
說明
- DbContext 操作的資料在最後 SaveChanges 時才批量儲存;
- DbContext 内所有操作,使用同一個事務;
- 當實體存在自增時,或者 Add/AddRange 的時候主鍵值為空,會提前開啟事務;
- 支援同步/異步方法;
FreeSql 其他資料
- 《分區、分表、分庫》
- 《租戶》
- 《過濾器、全局過濾器》
- 《Repository》
- 《UnitOfWork》
結束語
DbContext SaveChanges 性能測試結果挺可觀,待完善之日再發一篇專門的性能測試文章。
FreeSql 正在以快速演進的方式在更新,請求獻上寶貴的一星,謝謝!
github: https://github.com/2881099/FreeSql