zoukankan      html  css  js  c++  java
  • FreeSql.DbContext 第二个版本介绍

    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 其他资料

    结束语

    DbContext SaveChanges 性能测试结果挺可观,待完善之日再发一篇专门的性能测试文章。

    FreeSql 正在以快速演进的方式在更新,请求献上宝贵的一星,谢谢!

    github: https://github.com/2881099/FreeSql

  • 相关阅读:
    51nod 1428 活动安排问题
    COGS 1. 加法问题 (水体日常)
    COGS 1406. 邻居年龄排序[Age Sort,UVa 11462](水题日常)
    51nod 1133 不重叠的线段
    51nod 1031 骨牌覆盖
    51nod 1050 循环数组最大子段和
    51nod 1094 和为k的连续区间
    51nod 1433 0和5
    51nod 1092 回文字符串
    洛谷 P1507 NASA的食物计划
  • 原文地址:https://www.cnblogs.com/kellynic/p/10570948.html
Copyright © 2011-2022 走看看