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

  • 相关阅读:
    HDU 2544 最短路
    HDU 3367 Pseudoforest
    USACO 2001 OPEN
    HDU 3371 Connect the Cities
    HDU 1301 Jungle Roads
    HDU 1879 继续畅通工程
    HDU 1233 还是畅通工程
    HDU 1162 Eddy's picture
    HDU 5745 La Vie en rose
    HDU 5744 Keep On Movin
  • 原文地址:https://www.cnblogs.com/kellynic/p/10570948.html
Copyright © 2011-2022 走看看