JWT授权鉴权(四)swagger上添加自动发送Token的API

builder.Services.AddSwaggerGen(c => {
                #region Swagger使用鉴权组件
                c.AddSecurityDefinition("Bearer", new OpenApiSecurityScheme
                {
                    In = ParameterLocation.Header,
                    Type = SecuritySchemeType.ApiKey,
                    Description = "直接在下框中输入Bearer {token}(注意两者之间是一个空格)",
                    Name = "Authorization",
                    BearerFormat = "JWT",
                    Scheme = "Bearer"
                });
                c.AddSecurityRequirement(new OpenApiSecurityRequirement
                {
                  {
                    new OpenApiSecurityScheme
                    {
                      Reference=new OpenApiReference
                      {
                        Type=ReferenceType.SecurityScheme,
                        Id="Bearer"
                      }
                    },
                    new string[] {}
                  }
                });
                #endregion
            });

发表在 C#, JWT | 留下评论

JWT授权鉴权(三)鉴权服务器端代码 C#

引入nuget包

using Microsoft.AspNetCore.Authentication.JwtBearer;

添加鉴权部分代码

public static class JWTServiceExtend
    {
        public static IServiceCollection AddJWT(this IServiceCollection services) 
        {
            services.AddAuthentication(JwtBearerDefaults.AuthenticationScheme)
                .AddJwtBearer(options => {
                    options.TokenValidationParameters = new TokenValidationParameters
                    {
                        ValidateIssuerSigningKey = true,
                        //密匙
                        IssuerSigningKey = new SymmetricSecurityKey(Encoding.UTF8.GetBytes("SDMC-CJAS1-SAD-DFSFA-SADHJVF-VF")),
                        ValidateIssuer = true,           
                        //授权服务器地址
                        ValidIssuer = "http://localhost:5059",
                        ValidateAudience = true,
                        //鉴权服务器地址
                        ValidAudience = "http://localhost:5241",
                        ValidateLifetime = true,
                        //设置Token过期时间
                        ClockSkew = TimeSpan.FromMinutes(60)
                    };
                }
                );
            return services;
        }
    }

记得在Service部分添加使用

builder.Services.AddJWT();
发表在 C#, JWT | 留下评论

JWT授权鉴权(二)授权服务器端代码 C#

Claim[] claims = new Claim[] {
                new Claim(ClaimTypes.Name,data.Name),
                new Claim("Id",data.Id.ToString()),
                new Claim("UserName",data.UserName)
                //不能放敏感信息
                //此处便是(一)中的PAYLOAD的内容
            };

            //这个地方是授权服务器密匙的设置
            var key = new SymmetricSecurityKey(Encoding.UTF8.GetBytes("SDMC-CJAS1-SAD-DFSFA-SADHJVF-VF"));

            //这个地方是生成Token
            var token = new JwtSecurityToken(
                 //授权服务器地址
                 issuer: "http://localhost:5059",
                 //鉴权服务器地址
                 audience: "http://localhost:5241",
                 claims: claims,
                 notBefore: DateTime.Now,

                 //此处是Token的过期时间
                 expires: DateTime.Now.AddHours(1),
                 signingCredentials: new SigningCredentials(key, SecurityAlgorithms.HmacSha256)
             );
            var jwtToken = new JwtSecurityTokenHandler().WriteToken(token);
            return ApiResultHelper.Success(jwtToken);
发表在 C#, JWT | 留下评论

JWT授权鉴权(一)

JWT的数据结构

  • HEADER(json请求头)
    {
    “alg”: “HS256”
    ,”typ”: “JWT”
    }
  • PAYLOAD(用户信息等)
    {
    “sub”: “1234567890”,
    “name”: “John Doe”,
    “iat”: 1516239022
    }
  • VERIFY SIGNATURE(用sha256算法所加密的密文)
    HMACSHA256
    (
    base64UrlEncode(header) + “.” +
    base64UrlEncode(payload),
    your-256-bit-secret
    ) secret base64 encoded

    原理

    • 在授权服务器和鉴权服务器都有有密匙
      ->此密匙可以通过sha256算法加密和解密密文
    • 在授权服务器,验证密码通过以后,将上面的
      HEADER的开头一部分(base64UrlEncode(header))
      PAYLOAD的开头一部分(base64UrlEncode(payload))
      通过密匙(your-256-bit-secret)加密
      ->生成VERIFY SIGNATURE
    • HEADERPAYLOADVERIFY SIGNATURE返回客户端
    • 客户端向鉴权服务器请求时,将HEADERPAYLOADVERIFY SIGNATURE发送到鉴权服务器
      会进行鉴权动作:
      用本地的 密匙通过sha256解密VERIFY SIGNATURE的内容
      然后将其与接收到的HEADERPAYLOAD进行比对,无误则鉴权通过
    发表在 JWT | 留下评论

    更新表(二)

    配置输出Sql语句

    db.Aop.OnLogExecuting = (s, p) =>
                        {
                            Console.WriteLine("----------------------------");
                            Console.WriteLine($"Sql语句:{s}");
                        };

    单条更新 用传入的实体内容将数据库内容完全覆盖

    Student student = db.Queryable<Student>().First();
    student.CreateTime = DateTime.Now;
    db.Updateable<Student>(student).ExecuteCommand();

    按需更新 这个是实体改什么,数据库就改什么

    db.Tracking(student);
    student.Name = "Test";
    db.Updateable(student).ExecuteCommand();

    批量修改

    List<Student> students1 = db.Queryable<Student>().Take(10).ToList();
    foreach (var item in students1)
    {
         item.Name = "New Name " + DateTime.Now.ToString();
    }
    db.Updateable(students1).ExecuteCommand();
    
    //批量数据不能进行按需修改
    db.Tracking(students1);
    foreach (var item in students1)
    {
         item.Name = "New Name " + DateTime.Now.ToString();
    }
    db.Updateable(students1).ExecuteCommand();

    大量数据操作

    //插入大批量数据                  
    if (db.DbMaintenance.IsAnyTable("Student"))
    {
        db.DbMaintenance.DropTable("Student");
    }
    db.CodeFirst.InitTables(typeof(Student));
    List<Student> students2 = new List<Student>();
    for (int i = 0; i < 100000; i++)
    {
        students2.Add(new Student()
       {
          CreateTime = DateTime.Now,
          Name = $"Name_Update_{i}",
          SchoolId = i,
       }); ;
    }
    db.Fastest<Student>().BulkCopy(students2);
    
    
    ///修改大批量数据
    foreach (var item in students2)
    {
        item.Name = "NewDate" + DateTime.Now.ToString();
    }
    Console.WriteLine("开始批量修改计时");
    
    
    //普通更新
    Stopwatch stopwatch = new Stopwatch();
    stopwatch.Start();
    db.Updateable<Student>(students2).ExecuteCommand();
    stopwatch.Stop();
    Console.WriteLine($"批量修改1000000条数据共:{stopwatch.ElapsedMilliseconds} ms");
    
    
    //使用fastest更新 好像不通过OnLogExecuting这个通道
    Stopwatch stopwatch = new Stopwatch();
    stopwatch.Start();
    db.Fastest<Student>().BulkUpdate(students2);
    stopwatch.Stop();
    Console.WriteLine($"批量修改1000000条数据共:{stopwatch.ElapsedMilliseconds} ms");

    忽略更新某列

    Student student1 = db.Queryable<Student>().First(); 
    student1.SchoolId = 234; 
    student1.Name = "忽略某一列"; 
    student1.CreateTime = DateTime.Now.AddDays(3); 
    var result = db.Updateable(student1) 
                   .IgnoreColumns(
                      it => new { it.CreateTime, it.Name }
                      )
                   .ExecuteCommand();

    按需更新的另外一种写法

    Student student1 = db.Queryable<Student>().First();
    student1.SchoolId = 234;
    student1.Name = "忽略某列";
    student1.CreateTime = DateTime.Now.AddDays(3);
    var result = db.Updateable(student1)
                   .UpdateColumns(it => new { it.SchoolId, it.Name })
                   .ExecuteCommand();

    更新时忽略空的值和默认值

    Student student2 = db.Queryable<Student>().First();
    student2.SchoolId = 0;
    student2.CreateTime = null;
    
    var result = db.Updateable(student2)
                   .IgnoreColumns(ignoreAllNullColumns: true, ignoreAllDefaultValue: true)
                   .ExecuteCommand();

    更新数据的时候,WhereColumns选择指定列

    Student student3 = db.Queryable<Student>().Where(it => it.SchoolId == 3).First();
    student3.Name = "Test" + DateTime.Now.ToString();
    var result = db.Updateable(student3)
                   .WhereColumns(it => new { it.SchoolId })
                   .ExecuteCommand();

    条件更新

    Student student4 = db.Queryable<Student>().First();
    student4.Name = "Test1" + DateTime.Now.ToString();
    
    db.Updateable(student4).Where(it => it.SchoolId == 3)
      .UpdateColumns(it => new { it.Name })
      .ExecuteCommand();

    在实例的基础上重新复制更新

    Student student5 = db.Queryable<Student>().First();
    student.SchoolId = 5;
    student.Name = "test";
    
    var result = db.Updateable(student5)
                   .ReSetValue(it =>
                   {
                        it.Name = it.Name + "Reset";
                        it.CreateTime = DateTime.Now.AddDays(3);
                   })
                   .ExecuteCommand();

    表达式更新

    var result = db.Updateable<Student>()
                   .SetColumns(it => new Student()
                        {
                            Name = "FuncTest",
                            CreateTime = DateTime.Now.AddDays(3),
                        })
                   .Where(it => it.SchoolId == 5)
                   .ExecuteCommand();

    in的更新

    var ids = db.Queryable<Student>()
                .Where(x => x.SchoolId > 5 && x.SchoolId <= 10)
                .Select(x => x.SchoolId)
                .ToList();
    
    var result = db.Updateable<Student>()
                   .SetColumns(it => new Student() 
                                      { 
                                         CreateTime = DateTime.Now.AddDays(1)                   
                                      }
                              )
                   .Where(it => ids.Contains(it.SchoolId))
                   .ExecuteCommand();

    表达式无实体更新

    var result = db.Updateable<DbTableInfo>()
                   .AS("Student")
                   .SetColumns("StudentName","表达式无实体更新")
                   .Where("SchoolId=9")
                   .ExecuteCommand();

    根据字典更新

    Dictionary<string, object> dt = new Dictionary<string, object>();
                        dt.Add("SchoolId", 8);
                        dt.Add("StudentName", "字典更新2");
                        dt.Add("createTime", DateTime.Now);
                        //var Result = db.Updateable(dt).AS("Student")
                        //    .WhereColumns("SchoolId").ExecuteCommand();
    
    List<Dictionary<string, object>> dtList = new List<Dictionary<string, object>>();
                        dtList.Add(dt);
                        var Result1 = db.Updateable(dtList)
                                        .AS("Student")
                                        .WhereColumns("SchoolId")
                                        .ExecuteCommand();
    发表在 SQL Sugar | 留下评论

    更新表(一)

    使用的相关类

    Student

    [SugarTable("Student")]//当和数据库名称不一样可以设置表别名 指定表明
        public class Student
        {
            [SugarColumn(IsPrimaryKey = true, IsIdentity = true)]//数据库是自增才配自增 
            public int Id { get; set; }
    
            [SugarColumn(ColumnName = "SchoolId", IsNullable = true)]
            public int? SchoolId { get; set; }
    
            [SugarColumn(ColumnName = "StudentName", IsNullable = true)]//数据库与实体不一样设置列名 
            public string? Name { get; set; }
    
            //[SugarColumn(IsOnlyIgnoreInsert = true)]//设置后插入会取数据库默认值
            [SugarColumn(ColumnName = "CreateTime", IsNullable = true)]
            public DateTime? CreateTime { get; set; }
        }

    前置配置

    using (SqlSugarClient db = new SqlSugarClient(connectionConfig))
                {
                    if (db.DbMaintenance.IsAnyTable("Student"))
                    {
                        db.DbMaintenance.DropTable("Student");
                    }
                    db.CodeFirst.InitTables(typeof(Student));
    
                    List<Student> students = new List<Student>();
                    for (int i = 0; i < 10; i++)
                    {
                        students.Add(new Student()
                        {
                            CreateTime = DateTime.Now,
                            Name = $"测试数据_{i}",
                            SchoolId = i,
                        });
                    }
                    db.Insertable(students).ExecuteCommand();
           
         ///更新表(二)代码在这里实现
    }
    发表在 SQL Sugar | 留下评论

    插入表(二)

    开头配置代码

                ConnectionConfig connectionConfig = new ConnectionConfig()
                {
                    ConnectionString = SqlSugarConnectionString.GetConnectionString1(),
                    IsAutoCloseConnection = true,
                    DbType = DbType.SqlServer
                };
    
                Student student = new Student()
                {
                    Name = "返回自增列",
                    SchoolId = 1,
                    CreateTime = DateTime.Now
                };
    
                Snowflake snowflakeModel = new Snowflake()
                {
                    Name = "返回雪花ID",
                    SchoolId = 1
                };

    单条插入

                        if (db.DbMaintenance.IsAnyTable("Student"))
                        {
                            db.DbMaintenance.DropTable("Student");
                        }
                        if (db.DbMaintenance.IsAnyTable("Snowflake"))
                        {
                            db.DbMaintenance.DropTable("Snowflake");
                        }
                        ///初始化表
                        db.CodeFirst.InitTables(typeof(Snowflake), typeof(Student));
    
                        //删除学生,插入学生,返回自增ID
                        db.Deleteable<Student>().ExecuteCommand();
                        var sid = db.Insertable<Student>(student).ExecuteReturnIdentity();
    
                        //删除雪花,插入雪花,返回雪花ID
                        db.Deleteable<Snowflake>().ExecuteCommand();
                        var nid = db.Insertable<Snowflake>(snowflakeModel).ExecuteReturnSnowflakeId();
                        db.Deleteable<Student>().ExecuteCommand();
    
                        //实用技巧2: 强制设置表名(默认表名来自实体) 
                        db.Insertable(student).AS("Student").ExecuteCommand();
                        db.Deleteable<Student>().ExecuteCommand();
    
                        //字典插入  //不能写数据库中的字段名,必须和实体属性保持一致
                        Dictionary<string, object> dc = new Dictionary<string, object>();
                        dc.Add("SchoolId", 3);
                        dc.Add("Name", "字典插入");
                        dc.Add("CreateTime", "2023/1/24");
                        db.Insertable<Student>(dc).ExecuteCommand();
                        db.Deleteable<Student>().ExecuteCommand();
    
                        //匿名对象 插入
                        var obj = new
                        {
                            StudentName = "匿名对象 插入",
                            CreateTime = DateTime.Now,
                            SchoolId = "456"
                        };
                        db.Insertable<Dictionary<string, object>>(obj).AS("Student").ExecuteCommand();
                        db.Deleteable<Student>().ExecuteCommand();

    忽略或者指定插入

    忽略插入某列

    db.Deleteable<Student>().ExecuteCommand();
    db.Insertable(student).IgnoreColumns(s => s.Name).ExecuteCommand();

    直插入某列的数据

    db.Deleteable<Student>().ExecuteCommand();
    db.Insertable(student).InsertColumns(s => s.Name).ExecuteCommand();

    批量插入

    db.Deleteable<Student>().ExecuteCommand();
                        List<Student> students = new List<Student>();
                        for (int i = 0; i < 100; i++)
                        {
                            students.Add(new Student()
                            {
                                Name = $"StudentName_{i}",
                                SchoolId = i,
                                CreateTime = DateTime.Now
                            });
                        }
                        //(1)、非参数化插入(防注入) 
                        //优点:综合性能比较平均,列少1万条也不慢,属于万写法,不加事务情况下部分库有失败回滚机质
                        //缺点:数据量超过5万以上占用内存会比较大些,内存小可以用下面2种方式处理
                        db.Insertable(students).ExecuteCommand();
    
                        //(2)、使用参数化内部分页插入
                        //优点:500条以下速度最快,兼容所有类型和emoji,10万以上的大数据也能跑,就是慢些,内部分批量处理过了。
                        //缺点:500以上就开始慢了,要加事务才能回滚 
                        db.Insertable(students).UseParameter().ExecuteCommand();
    
                        //(3)、大数据写入(特色功能:大数据处理上比所有框架都要快30%)
                        //优点:1000条以上性能无敌手
                        //缺点:不支持数据库默认值, API功能简单, 小数据量并发执行不如普通插入,插入数据越大越适合用这个
                        //新功能 5.0.44
                        db.Fastest<Student>().PageSize(100000).BulkCopy(students);

    大数据插入演示

                        List<Student> students = new List<Student>();
                        for (int i = 0; i < 10000; i++)
                        {
                            students.Add(new Student()
                            {
                                Name = $"Name_{i}",
                                SchoolId = i,
                                CreateTime = DateTime.Now
                            });
                            ;
                        }
                        db.Deleteable<Student>().ExecuteCommand();
    
                        Stopwatch stopwatch = Stopwatch.StartNew();
                        stopwatch.Start();
                        db.Insertable<Student>(students).ExecuteCommand();
                        stopwatch.Stop();
                        Console.WriteLine($"普通方式:1000000条数据大概用时:{stopwatch.ElapsedMilliseconds} 毫秒");
    
                        db.Deleteable<Student>().ExecuteCommand();
    
                        stopwatch.Reset();
                        stopwatch.Start();
                        db.Fastest<Student>().BulkCopy(students);
                        stopwatch.Stop();
                        Console.WriteLine($"BulkCopy大数据操作:1000000条数据大概用时:{stopwatch.ElapsedMilliseconds} 毫秒");

    分页插入

                        if (db.DbMaintenance.IsAnyTable("Student"))
                        {
                            db.DbMaintenance.DropTable("Student");
                        }
                        db.CodeFirst.InitTables(typeof(Student));
                        List<Student> students = new List<Student>();
                        for (int i = 0; i < 100; i++)
                        {
                            students.Add(new Student()
                            {
                                Name = $"StudentName_{i}",
                                SchoolId = i,
                                CreateTime = DateTime.Now
                            });
                        }
    
                        db.Utilities.PageEach(students, 10, pageList =>
                        {
                            db.Insertable(pageList).ExecuteCommand();
                        });

    Guid主键自动赋值

    含有主键为Guid的插入,会进行自动对Guid赋值

                        if (db.DbMaintenance.IsAnyTable("UserInfo"))
                        {
                            db.DbMaintenance.DropTable("UserInfo");
                        }
                        db.CodeFirst.InitTables(typeof(UserInfo));
                        UserInfo userInfo = new UserInfo()
                        {
                            Name = "Zhang",
                            CreateTime = DateTime.Now
                        };
                        db.Insertable(userInfo).ExecuteCommand();

    使用实体的时候可以调用它里面的方法

    db.CodeFirst.InitTables(typeof(UnitInsertMethod));
    db.Deleteable<UnitInsertMethod>().ExecuteCommand();
    db.Insertable(new UnitInsertMethod() { Name = "1" })
       .CallEntityMethod(it => it.Create())         
       .ExecuteCommand();
    db.Insertable(new UnitInsertMethod() { Name = "1" })
       .CallEntityMethod(it => it.Modify("Test"))
       .ExecuteCommand();

    插入临时表

    db.Deleteable<UserInfo>().ExecuteCommand();
    UserInfo userInfo = new UserInfo()
    {
        Name = "Zhang",
        CreateTime = DateTime.Now
    };
    db.Insertable(userInfo).ExecuteCommand();
    db.Ado.OpenAlways();
    db.Queryable<UserInfo>().Select(" * into #temp").ToList();
    var tempList = db.Queryable<dynamic>().AS("#temp").ToList();
    发表在 SQL Sugar | 留下评论

    插入表(一)

    使用的类

    Snowflake

        [SugarTable("Snowflake")]
        public class Snowflake
        {
            [SugarColumn(IsPrimaryKey = true)]//数据库是自增才配自增 
            public long Id { get; set; }
            public int? SchoolId { get; set; }
            [SugarColumn(ColumnName = "StudentName")]//数据库与实体不一样设置列名 
            public string? Name { get; set; }
        }

    Student

    [SugarTable("dbstudent")]//当和数据库名称不一样可以设置表别名 指定表明
        public class Student
        {
            [SugarColumn(IsPrimaryKey = true, IsIdentity = true)]//数据库是自增才配自增 
            public int Id { get; set; }
    
            [SugarColumn(ColumnName = "SchoolId", IsNullable = true)]
            public int? SchoolId { get; set; }
    
            [SugarColumn(ColumnName = "StudentName", IsNullable = true)]//数据库与实体不一样设置列名 
            public string? Name { get; set; }
    
            //[SugarColumn(IsOnlyIgnoreInsert = true)]//设置后插入会取数据库默认值
            [SugarColumn(ColumnName = "CreateTime", IsNullable = true)]
            public DateTime? CreateTime { get; set; }
        }

    UserInfo

        [SugarTable("UserInfo")]//当和数据库名称不一样可以设置表别名 指定表明
        public class UserInfo
        {
    
        [SugarColumn(IsPrimaryKey = true)]
        public Guid uId { get; set; }    
    
        [SugarColumn(ColumnName = "Name", IsNullable = true)]
        public string? Name { get; set; }
    
        [SugarColumn(ColumnName = "CreateTime", IsNullable = true)]
        public DateTime? CreateTime { get; set; }
    
    
        /// <summary>
        /// 租户Id
        /// </summary>
        public int OrgId { get; set; }
    
        /// <summary>
        /// 
        /// </summary>
        public string? Connection { get; set; }
    }

    UnitInsertMethod

        public class UnitInsertMethod
        {
            public int Id { get; set; }
            public string Name { get; set; }
    
            public DateTime Time { get; set; }
            public string UserId { get; set; }
    
            public void Create() 
            {
                this.Time= DateTime.Now;
                this.UserId = "1";
            }
            public void Modify(string a) 
            {
                this.Time= DateTime.Now;
                this.UserId = a;
            }
        }
    发表在 SQL Sugar | 留下评论

    Sql sugar 库表操作API

    API表

    名称备注返回
    类型
    GetDataBaseList获取所有数据库名称List
    GetViewInfoList查询所有视图List
    GetTableInfoList获取所有表,查询所有的表
    (GetTableInfoList(是否缓存))
    List
    GetColumnInfosByTableName获取列根据表名,获取字段,字段信息
    GetColumnInfosByTableName(表名,是否缓存)
    List
    GetIsIdentities获取自增列List
    GetPrimaries获取主键List
    IsAnyTable表是否存在,判断表存不存在 (IsAny(表名,是否缓存))bool
    IsAnyColumn列是否存在bool
    IsPrimaryKey主键是否存在bool
    IsIdentity自增是否存在bool
    IsAnyConstraint约束是否存在bool
    DropTable删除表bool
    TruncateTable清空表bool
    CreateTable创建表说明:如果有实体类优先用CodeFirst建表,这个是底层方法用该方法建表,因为数据库不同,有些属性需要用单纯写个方法去创建,当前表格这些方法都有现成的bool
    AddColumn添加列bool
    UpdateColumn更新列bool
    AddPrimaryKey添加主键bool
    DropConstraint删除约束bool
    BackupDataBase备份库bool
    DropColumn删除列bool
    RenameColumn重命名列bool
    AddDefaultValue添加默认值bool
    AddTableRemark添加表描述,表注释bool
    AddColumnRemark添加列描述,表注释bool
    DeleteColumnRemark删除列描述,表注释bool
    RenameTable重命名表bool
    CreateIndex创建索引bool
    IsAnyIndex索引是否存在bool

    代码示例

    public static void Show() 
            {
                ConnectionConfig connectionConfig = new ConnectionConfig();
                connectionConfig.ConnectionString = SqlSugarConnectionString.GetConnectionString1();
                connectionConfig.IsAutoCloseConnection = true;
                connectionConfig.DbType = DbType.SqlServer;
    
                using (SqlSugarClient sqlSugarClient = new SqlSugarClient(connectionConfig))
                {
                    ///获取所有数据库名称
                    var list1 =   sqlSugarClient.DbMaintenance.GetDataBaseList();
                    foreach (var item in list1)
                    {
                        Console.WriteLine(item);
                    }
                    Console.WriteLine("******************************************************");
                    
                    ///查询所有视图
                    var list2 = sqlSugarClient.DbMaintenance.GetViewInfoList();
                    foreach (var item in list2)
                    {
                        Console.WriteLine(item.Name);
                    }
                    Console.WriteLine("******************************************************");
    
                    ///查询当前连接字符串连接数据库的所有表名称
                    var list3 =sqlSugarClient.DbMaintenance.GetTableInfoList();
                    foreach (var item in list3)
                    {
                        Console.WriteLine(item.Name);
                    }
                    Console.WriteLine("******************************************************");
    
                    ///根据表名称获取列的信息
                    var List4 = sqlSugarClient.DbMaintenance.GetColumnInfosByTableName("Student");
                    foreach (var item in List4)
                    {
                        Console.WriteLine(item.DbColumnName);
                    }
                    Console.WriteLine("******************************************************");
    
                    ///获取自增的列
                    var list5 = sqlSugarClient.DbMaintenance.GetIsIdentities("CodeFirstTable1");
                    foreach (var item in list5)
                    {
                        Console.WriteLine(item);
                    }
                    Console.WriteLine("******************************************************");
                }
            }
    发表在 SQL Sugar | 留下评论

    Sql Sugar 特性列表

    特性列表

    名称描述
    IsIdentity是否创建自增标识
    IsPrimaryKey是否创建主键标识
    ColumnName创建数据库字段的名称(默认取实体类属性名称)
    ColumnDataType创建数据库字段的类型用法1: “varchar(20)” 不需要设置长度用
    法2: 不设置该参数 系统会根据C#类型自动生成相应的数据库类型 用
    法3: 多库兼容可以用 :看标题9
    IsIgnoreORM不处理该列
    ColumnDescription备注 表注释 (新版本支持XML文件)
    Length长度 设成10会生成 xxx类型(10), 没括号的不设置
    IsNullable是否可以为null默为false
    DecimalDigits是否可以为null默为false
    OracleSequenceName设置Oracle序列,设置后该列等同于自增列
    OldColumnName修改列名用,这样不会新增或者删除列
    IndexGroupNameList创建索引用
    UniqueGroupNameList创建唯一索引
    注意:有2个属性用处不
    同DefaultValue
    IsOnlyIgnoreInsert
    DefaultValue=默认值 用来建表设置字段默认值
    IsOnlyIgnoreInsert=true 插入数据时取默认值很多情况需要2个一
    起使用如果只建表不插入数据用1个 如果建表并且插入数据用2个
    特性列表

    特殊支持

    如果大量使用 ColumnDataType=”nvarchar(50)” 自定义类型将无法很好的支持多种数据库,比如很多库不支持nvarchar
    当然你也可以使用AOP替换 ColumnDataType 去实现多库,下面介绍自带的方案

    string 大文
    [SugarColumn(ColumnDataType = “longtext,text,clob”)] public string
    FieldName{ get; set; } 注意暂时不支持 varchar(max)后面只能用text
    string 设置
    长度的字符
    [SugarColumn(Length=10)] public string FieldName{ get; set; }
    int 整数public int FieldName{ get; set; }
    short 整数
    public short FieldName{ get; set; }
    long 大数
    public long FieldName{ get; set; }
    bool 真假public bool FieldName{ get; set;}
    decimal 默
    public decimal FieldName{ get; set; }
    decimal 自
    定义
    //18,2 18,4 18,6 这几种兼容性好
    [SugarColumn(Length=18,DecimalDigits=2)]public decimal FieldName{
    get; set; }
    DateTime
    时间
    public DateTime FieldName{ get; set; }
    枚举 (数据库存int)public 枚举 FieldName{ get; set; }
    发表在 SQL Sugar | 留下评论