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
});
JWT授权鉴权(四)swagger上添加自动发送Token的API
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();
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);
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 - 将HEADER,PAYLOAD,VERIFY SIGNATURE返回客户端
- 客户端向鉴权服务器请求时,将HEADER,PAYLOAD,VERIFY SIGNATURE发送到鉴权服务器
会进行鉴权动作:
用本地的 密匙通过sha256解密VERIFY SIGNATURE的内容
然后将其与接收到的HEADER,PAYLOAD进行比对,无误则鉴权通过
更新表(二)
配置输出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();
更新表(一)
使用的相关类
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();
///更新表(二)代码在这里实现
}
插入表(二)
开头配置代码
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();
插入表(一)
使用的类
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 库表操作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 特性列表
特性列表
名称 | 描述 |
IsIdentity | 是否创建自增标识 |
IsPrimaryKey | 是否创建主键标识 |
ColumnName | 创建数据库字段的名称(默认取实体类属性名称) |
ColumnDataType | 创建数据库字段的类型用法1: “varchar(20)” 不需要设置长度用 法2: 不设置该参数 系统会根据C#类型自动生成相应的数据库类型 用 法3: 多库兼容可以用 :看标题9 |
IsIgnore | ORM不处理该列 |
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; } |