SqlSugar Code First
//建库:如果不存在创建数据库存在不会重复创建 createdb
db.DbMaintenance.CreateDatabase(); // 注意 :Oracle和个别国产库需不支持该方法,需要手动建库
//创建表:根据实体类CodeFirstTable1 (所有数据库都支持)
db.CodeFirst.InitTables(typeof(CodeFirstTable1));//这样一个表就能成功创建了
//保护机质说明:如果不是sqlsugar建的表执行CodeFirst会报错看标题8
//实体定义看2.1
public class CodeFirstTable1
{
[SugarColumn(IsIdentity = true, IsPrimaryKey = true)]
public int Id { get; set; }
public string Name { get; set; }
//ColumnDataType 一般用于单个库数据库,如果多库不建议用
[SugarColumn(ColumnDataType = "Nvarchar(255)")]
public string Text { get; set; }
[SugarColumn(IsNullable = true)]//可以为NULL
public DateTime CreateTime { get; set; }
}
/***创建单个表***/
db.CodeFirst.SetStringDefaultLength(200).InitTables(typeof(CodeFirstTable1));//这样一个表就能成功创建了
/***手动建多个表***/
db.CodeFirst.SetStringDefaultLength(200)
.InitTables(typeof(CodeFirstTable1),typeof(CodeFirstTable2));
/***批量创建表***/
//语法1:
Type[] types= Assembly
.LoadFrom("XXX.dll")//如果 .dll报错,可以换成 xxx.exe 有些生成的是exe
.GetTypes().Where(it=>it.FullName.Contains("OrmTest."))//命名空间过滤,当然你也可以写其他条件过滤
.ToArray();//断点调试一下是不是需要的Type,不是需要的在进行过滤
db.CodeFirst.SetStringDefaultLength(200).InitTables(types);//根据types创建表
//语法2:
Type[] types= typeof(任意实体类中的类).Assembly.GetTypes()
.Where(it=>it.FullName.Contains("OrmTest."))//命名空间过滤,当然你也可以写其他条件过滤
.ToArray();
db.CodeFirst.SetStringDefaultLength(200).InitTables(types);//根据types创建表
var db = new SqlSugarClient(new ConnectionConfig()
{
DbType = SqlSugar.DbType.SqlServer,
ConnectionString = Config.ConnectionString,
IsAutoCloseConnection = true,
ConfigureExternalServices = new ConfigureExternalServices
{
//注意: 这儿AOP设置不能少
EntityService = (c, p) =>
{
/***低版本C#写法***/
// int? decimal?这种 isnullable=true 不支持string(下面.NET 7支持)
if (p.IsPrimarykey==false&&c.PropertyType.IsGenericType &&
c.PropertyType.GetGenericTypeDefinition() == typeof(Nullable<>))
{
p.IsNullable = true;
}
/***高版C#写法***/
//支持string?和string
if(p.IsPrimarykey==false&&new NullabilityInfoContext()
.Create(c).WriteState is NullabilityState.Nullable)
{
//p.IsNullable = true;
}
}
}
});
//定义CodeFirst实体
public class xxxxx1
{
//没有?是必填
[SugarColumn(IsIdentity = true, IsPrimaryKey = true)]
public int id { get; set; }
//字符串没办法加? 那就加特性[SugarColumn(IsNullable = true)]
//如果不想用SugarColumn, AOP里面打个断点能进P.IsNullable=true说明就成功了,用法很灵活逻辑自已控制
public string RequiredName { get; set; }
//带?可空
public int? id1 { get; set; }
}
SqlSugarClient db = new SqlSugarClient(new ConnectionConfig()
{
DbType = DbType.SqlServer,
ConnectionString = Config.ConnectionString3,
IsAutoCloseConnection = true,
ConfigureExternalServices=new ConfigureExternalServices()
{
EntityService = (x,p) => //处理列名
{
//最好排除DTO类
p.DbColumnName = UtilMethods.ToUnderLine(p.DbColumnName);//ToUnderLine驼峰转下划线方法
},
EntityNameService = (x, p) => //处理表名
{
//最好排除DTO类
p.DbTableName=UtilMethods.ToUnderLine(p.DbTableName);//ToUnderLine驼峰转下划线方法
}
}
});
//表名mysql: test_name , oracle就是 TEST_NAME
//public class TestName
SqlSugarClient db = new SqlSugarClient(new ConnectionConfig()
{
DbType = DbType.SqlServer,
ConnectionString = Config.ConnectionString3,
InitKeyType = InitKeyType.Attribute,
IsAutoCloseConnection = true,
ConfigureExternalServices = new ConfigureExternalServices()
{
EntityService = (s, p) =>
{
//如果是Order实体进行相关配置
p.IfTable<Order>()
.UpdateProperty(it => it.id, it =>
{
it.IsIdentity = true;
it.IsPrimarykey = true;
})
.UpdateProperty(it => it.Name, it => {
it.Length = 100;
it.IsNullable = true;
})
.OneToOne(it => it.Item, nameof(Order.ItemId));
//如果Custom实体进行相关配置
p.IfTable<Custom>()
.UpdateProperty(it => it.id, it =>
{
it.IsIdentity = true;
it.IsPrimarykey = true;
})
.UpdateProperty(it => it.Text, it => {
it.DataType= StaticConfig.CodeFirst_BigString;//支持多库的MaxString用法
})
//可以结合全局逻辑一起使用,下面的和上面的有冲突的话,下面会覆盖上面的
//统一设置 nullable等于isnullable=true
//低版本C#看标题2.2
if(p.IsPrimaryKey==false&&new NullabilityInfoContext()
.Create(c).WriteState is NullabilityState.Nullable)
{
p.IsNullable = true;
}
}
}
});
//性能说明:
//EntityService 相同实体只会执行一次性不需太操作
var typeBilder = db.DynamicBuilder().CreateClass("table1", new SugarTable(){});
//可以循环添加列
typeBilder.CreateProperty("Id",typeof(int),new SugarColumn(){IsPrimaryKey=true,IsIdentity=true});
typeBilder.CreateProperty("Name", typeof(string), new SugarColumn() { });
//SugarColumn 说明看标题4
//创建类
var type = typeBilder.BuilderType();//想缓存有typeBilder.WithCache
//创建表
db.CodeFirst.InitTables(type); //建表属性API看迁移
|
功能
|
说明
|
|
添加列
|
在实体加添加属性
|
|
修改列
|
3种方式:
1、删除列执行CodeFirst后在添加列(兼容性好,缺点数据会消失)
2、更改类型,非空、长度 等执行CodeFirst【标题4有详细说明】
精度修改:默情况下decimal和double类型是不能修改精度的
我们可以启用精度修改配置
IsAutoCloseConnection = true, MoreSettings=new ConnMoreSettings() { EnableCodeFirstUpdatePrecision= true,//启用 //5.1.4.1.6-preview17+ }
(缺点:特殊情况修改不了比如约束等,需要用方案1 或者手动改库)
3、修改列名保留数据【5.1有详细说明】
Sqlite不支持 修改 (官方没提供修改表的SQL语法)
|
|
删除列
|
在实体删除属性 (标题6,7可以禁用)
Sqlite 需要配置,需要升级到 5.1.4.118 - preview04+以上
IsAutoCloseConnection =
true
,
DbType = DbType.Sqlite,
ConnectionString = Connection,
MoreSettings =
new
ConnMoreSettings()
{
//只支持.net core
SqliteCodeFirstEnableDropColumn =
true
}
|
|
索引
|
特性设置索引就会建索引,只能手动删除索引【4.3有详细说明】
|
|
描述
|
表名和列都支持看文档 5.2
支持实体生成的XML备注,需要生成XML
|
|
高安全级别:禁用更新
|
禁用后表结构不会发生变化 看档 6和7
|
|
高安全级别:手动对比迁移
|
纯手动去处理数据为变更 看文档10
|
|
名称
|
描述
|
|
IsIdentity
|
是否创建自增标识
|
|
IsPrimaryKey
|
是否创建主键标识
|
|
ColumnName
|
创建数据库字段的名称(默认取实体类属性名称)
|
|
ColumnDataType
|
创建数据库字段的类型
用法1: “varchar(20)” 不需要设置长度
用法2: 不设置该参数 系统会根据C#类型自动生成相应的数据库类型
用法3: 多库兼容 :标题4.2和标题9
|
|
IsIgnore
|
ORM不处理该列
|
|
ColumnDescription
|
备注 表注释
新版本支持XML文件 , XML名字不要自已改要和类库名一样
把xml发布dll相同目录
|
|
Length
|
长度 设成10会生成 xxx类型(10), 没括号的不设置
|
|
IsNullable
|
是否可以为null默为false
|
|
DecimalDigits
|
精度 如 decimal(18,2) length=18,DecimalDigits=2
|
|
OracleSequenceName
|
设置Oracle序列,设置后该列等同于自增列
|
|
OldColumnName
|
修改列名用,这样不会新增或者删除列
|
|
IndexGroupNameList
|
已弃用 ,
新用法看
文档
4.3
|
|
UniqueGroupNameList
|
已弃用, 新用法看文档4.3
|
|
注意:有2个属性用处不同
DefaultValue
IsOnlyIgnoreInsert
|
DefaultValue=默认值 用来建表设置字段默认值
IsOnlyIgnoreInsert=true 插入数据时取默认值
很多情况需要2个一起使用
如果只建表不插入数据用1个
如果建表并且插入数据用2个
|
|
ExtendedAttribute
|
扩展属性 ,可以结合EntityService 实体AOP使用
|
|
string 大文本
|
5.1.3.44-preview06 推荐
[SugarColumn(ColumnDataType = StaticConfig.CodeFirst_BigString)]
|
|
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; }
|
|
byte[] 二进制
|
public byte[] FileInfo{get;set;}
建议:升级到 SqlSugarCore 5.1.3.46-preview09 及以上
对多库支持了比较好
|
|
SqlServer特殊配置:和他库不同一般选用Nvarchar,可以使用这个配置让他和其他数据库区分(其他库是varchar)
|
DbType = SqlSugar.DbType.SqlServer,
ConnectionString ="字符串",
IsAutoCloseConnection =
true
,
MoreSettings=new ConnMoreSettings() {
SqlServerCodeFirstNvarchar= true,
}
|
//普通索引
[SugarIndex("index_codetable1_name",nameof(CodeFirstTable1.Name),OrderByType.Asc)]
//唯一索引 (true表示唯一索引 或者叫 唯一约束)
[SugarIndex("unique_codetable1_CreateTime", nameof(CodeFirstTable1.CreateTime), OrderByType.Desc,true)]
//复合普通索引
[SugarIndex("index_codetable1_nameid", nameof(CodeFirstTable1.Name), OrderByType.Asc,
nameof(CodeFirstTable1.Id), OrderByType.Desc)]
public class CodeFirstTable1
{
[SugarColumn(IsIdentity = true, IsPrimaryKey = true)]
public int Id { get; set; }
public string Name { get; set; }
[SugarColumn(ColumnDataType = "Nvarchar(255)")]//custom
public string Text { get; set; }
[SugarColumn(IsNullable = true)]
public DateTime CreateTime { get; set; }
}
//分表的用户注意了:请升级到5.0.8.6-preview03修复了分表问题
//占位符 {table} {db}
//请升级到 5.0.2.3preivew04
//使用 {db} 进行占位符替换,小写不要有空格
[SugarIndex("{db}index_codetable1_name",nameof(CodeFirstTable1.Name),OrderByType.Asc)]
//表名占位符(自动分表不需要加这个自动的)
[SugarIndex("index_{table}_name",nameof(CodeFirstTable1.Name),OrderByType.Asc)]
//不要有空格并且小写等于 include(name,id)
[SugarIndex("IndexUnituadfasf1_longx{include:name,id}", nameof(longx), OrderByType.Asc)]
public class Unituadfasf1
{
public ulong longx { get; set; }
public int id { get; set; }
public string name { get; set; }
}
db.CodeFirst.InitTables(typeof(CodeFirstTable));
[SugarTable("CodeFirstTable2",TableDescription = "表备注")]//表添加备注
public class CodeFirstTable
{
[SugarColumn(IsPrimaryKey = true, ColumnDescription="主键")]//列添加备注
public Guid Id { get; set; }
}
//技巧:表名可以为null,这样就会取实体名
[SugarTable(null,TableDescription = "表备注")]//表添加备注
[SugarTable("Custom","客户",IsDisabledDelete =true)]
public class Custom
{
public int Id { get; set; }
public string Name { get; set; }
}
DbType = SqlSugar.DbType.PostgreSQL,
ConnectionString = Config.ConnectionString,
ConfigureExternalServices=new ConfigureExternalServices() {
EntityNameService = (type, entity) =>
{
entity.IsDisabledDelete = true;
}
}
[SugarTable("Custom","客户",IsDisabledUpdateAll=true)]//安全级别比 IsDisabledDelete 更高,只创建不修改和删除
public class Custom
{
public int Id { get; set; }
public string Name { get; set; }
}
db.CodeFirst.SetStringDefaultLength(200).InitTables(typeof(Custom)); //注意这行代码加的
//上面配置等同于
//if(表不存在)
//{
// db.CodeFirst.SetStringDefaultLength(200).InitTables(typeof(Custom));
///}
var db = new SqlSugarClient(new ConnectionConfig()
{
DbType = SqlSugar.DbType.SqlServer,
ConnectionString = Config.ConnectionString,
IsAutoCloseConnection = true,
ConfigureExternalServices = new ConfigureExternalServices
{
EntityService = (c, p) =>
{
if (type==SqlSugar.DbType.MySql&&p.DataType == "varchar(max)")
{
p.DataType = "longtext";
}
}
}
});

[SqlSugar.SugarTable("Custom", IsCreateTableFiledSort =true)]//开启排序不能少
public class Custom
{
[SqlSugar.SugarColumn(CreateTableFieldSort = 1)]
public int Id { get; set; }
[SqlSugar.SugarColumn( CreateTableFieldSort =2)]
public string Name { get; set; }
}
//根据特性标识哪个库 (需要高版本才支持)
db.CodeFirst.InitTablesWithAttr(new[] { typeof(UserInfo001), typeof(UserInfo002) });
//指定库
db.GetConnection("id").CodeFirst.InitTables(new[] { typeof(UserInfo001), typeof(UserInfo002) });
SqlSugar Code First的更多相关文章
- 一步一步创建ASP.NET MVC5程序[Repository+Autofac+Automapper+SqlSugar](九)
前言 童鞋们,大家好 我是专注.NET开发者社区建设的实践者Rector. 首先,为自己间隔了两个星期五再更新本系列文章找个不充分的理由:Rector最近工作,家庭的各种事务所致,希望大家谅解. 本文 ...
- sqlsugar的sum的用法
通过论坛的检索 查到三篇文章是关于sum的 http://www.codeisbug.com/Ask/9/4531 http://www.codeisbug.com/Ask/14/4128 文章1:2 ...
- SqlSugar入门级教程+实例 (.net core下的)
官方参考:http://www.codeisbug.com/Doc/8 前言:这应该是目前最好用的ORM框架之一了,而且支持.net core,网上除了官方文档其他参考就少了点,自己整理了一下,大致包 ...
- ORM 创新解放劳动力 -SqlSugar 新功能介绍
介绍 SqlSugar是一款 老牌 .NET 开源ORM框架,由果糖大数据科技团队维护和更新 ,Github star数仅次于EF 和 Dapper 优点: 简单易用.功能齐全.高性能.轻量级.服务齐 ...
- 基于SqlSugar的数据库访问处理的封装,支持多数据库并使之适应于实际业务开发中
在我的各种开发框架中,数据访问有的基于微软企业库,有的基于EFCore的实体框架,两者各有其应用场景,不过多的去比较.最近在使用SqlSugar的时候,觉得这个数据访问处理的组件确实很灵活,据说性能也 ...
- 基于SqlSugar的开发框架循序渐进介绍(17)-- 基于CSRedis实现缓存的处理
在一个应用系统的开发框架中,往往很多地方需要用到缓存的处理,有些地方是为了便于记录用户的数据,有些地方是为了提高系统的响应速度,如有时候我们在发送一个短信验证码的时候,可以在缓存中设置几分钟的过期时间 ...
- Visual Studio Code 代理设置
Visual Studio Code (简称 VS Code)是由微软研发的一款免费.开源的跨平台文本(代码)编辑器,在十多年的编程经历中,我使用过非常多的的代码编辑器(包括 IDE),例如 Fron ...
- 我们是怎么做Code Review的
前几天看了<Code Review 程序员的寄望与哀伤>,想到我们团队开展Code Review也有2年了,结果还算比较满意,有些经验应该可以和大家一起分享.探讨.我们为什么要推行Code ...
- Code Review 程序员的寄望与哀伤
一个程序员,他写完了代码,在测试环境通过了测试,然后他把它发布到了线上生产环境,但很快就发现在生产环境上出了问题,有潜在的 bug. 事后分析,是生产环境的一些微妙差异,使得这种 bug 场景在线下测 ...
- 从Script到Code Blocks、Code Behind到MVC、MVP、MVVM
刚过去的周五(3-14)例行地主持了技术会议,主题正好是<UI层的设计模式——从Script.Code Behind到MVC.MVP.MVVM>,是前一天晚上才定的,中午花了半小时准备了下 ...
随机推荐
- ME5A报表增强
一.ME5A报表新增长文本字段 结构中添加字段 在该方法下添加对应的取值逻辑 二.ME5A点击科目分配按钮界面添加字段 结构中添加字段 对应位置写取值逻辑 定期更文,欢迎关注 TRANSLATE wi ...
- VS以及C++开发和学习使用注意事项
VS以及C++开发使用注意事项 在vs2013版本开始出现安全检查 最好提前禁用错误4996 制表符问题:Visual Studio中设置Tab键对应空格数的方如下:依次选择:工具-〉选项 -〉文本编 ...
- POJ 1456 Supermarket【贪心 + 并查集】
http://poj.org/problem?id=1456 题意:给你 N 件不同的商品,每件商品最多可以买一次.每件物品对应两个值 pi di pi 表示物品的价值,di 表示可以买的最迟时间(也 ...
- px2vw一个px单位转成vw单位的VSCode插件
px2vw 一个 px 单位转成 vw 单位的 VSCode 插件
- 简易机器学习笔记(八)关于经典的图像分类问题-常见经典神经网络LeNet
前言 图像分类是根据图像的语义信息对不同类别图像进行区分,是计算机视觉的核心,是物体检测.图像分割.物体跟踪.行为分析.人脸识别等其他高层次视觉任务的基础.图像分类在许多领域都有着广泛的应用,如:安防 ...
- java 对象作为成员变量
public class Main { private int uplimit; private int value; public Main(int uplimit){ this.uplimit = ...
- ClickHouse的WITH-ALIAS是如何实现的
ClickHouse的WITH-ALIAS是如何实现的 WITH-ALIAS包含相似但不同的两个特性: WITH <表达式> as <别名> WITH <别名> a ...
- 03-点亮LED灯
1.FPGA设计流程 1.设计规划 对项目需求了解,划分子功能模块,子功能模块的输入输出信号及通信关系 2.波形绘制 了解子模块的功能,画出框图,搞清楚如何通过输入信号得到输出信号,进而绘制波形图 3 ...
- 2023 SHCTF-校外赛道 PWN WP
WEEK1 nc 连接靶机直接梭 hard nc 同样是nc直接连,但是出题人利用linux命令的特性,将部分flag放在了特殊文件中 利用ls -a查看所有文件,查看.gift,可以得到前半段 然后 ...
- SpringMVC05——SSM整合
整合SSM 需求:熟练掌握MySQL数据库,Spring,JavaWeb及MyBatis知识,简单的前端知识 CREATE DATABASE `ssmbuild`; USE `ssmbuild`; D ...