巨奢网 首页 名表图片鉴赏 查看内容

C# 动态创建类,动态创建表,支持多库的数据库维护计划

2023-4-1 08:45| 发布者: fuwanbiao| 查看: 55| 评论: 0

摘要: ↓引荐关注↓一、创建表SqlSugar支持了3种方式的建表(无实体建表、实体建表,实体特性建表),十分的灵活能够多个数据库 MYSQL MSSQL ORACLE SQLITE PGSQL 等用同一语法创建数据库,不需求思索数据库的兼容性中间规范 ...
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=``newConnMoreSettings {`` `` ``SqlServerCodeFirstNvarchar= ``true``,`` `` ``}

1.1、经过特性建表


我们能够经过创建实体来进行建表


publicclassCodeFirstTable1


{


[ SugarColumn(IsIdentity = true, IsPrimaryKey = true)]


publicintId { get; set; }


publicstringName { get; set; }


//ColumnDataType 自定格式的状况 length不要设置 (想要多库兼容看4.2和9)


[ SugarColumn(ColumnDataType = "Nvarchar(255)") ]


publicstringText { get; set; }


[ SugarColumn(IsNullable = true)] //能够为NULL


publicDateTime CreateTime { get; set; }


}


/***创建单个表***/


db.CodeFirst.SetStringDefaultLength( 200).InitTables( typeof(CodeFirstTable1)); //这样一个表就能胜利创建了


/***手动建多个表***/


db.CodeFirst.SetStringDefaultLength( 200)


.InitTables( typeof(CodeFirstTable1), typeof(CodeFirstTable2));


建表特性如下


IsIdentity能否创建自增标识IsPrimaryKey能否创建主键标识ColumnName创建数据库字段的称号(默许取实体类属性称号)ColumnDataType创建数据库字段的类型用法1:“varchar(20)” 不需求设置长度用法2: 不设置该参数 系统会依据C#类型自动生成相应的数据库类型 用法3: 多库兼容能够用 :看题目9IsIgnoreORM不处置该列ColumnDeion备注 表注释 (新版本支持XML文件)Length长度 设成10会生成 xxx类型(10), 没括号的不设置IsNullable能否能够为null默为falseDecimalDigits精度 如 decimal(18,2) length=18,DecimalDigits=2OracleSequenceName设置Oracle序列,设置后该列同等于自增列OldColumnName修正列名用,这样不会新增或者删除列IndexGroupNameList已弃用 ,新用法看文档4.3UniqueGroupNameList已弃用, 新用法看文档4.3留意:有2个属性用处不同DefaultValue IsOnlyIgnoreInsertDefaultValue=默许值 用来建表设置字段默许值IsOnlyIgnoreInsert=true 插入数据时取默许值很多状况需求2个一同运用假如只建表不插入数据用1个 假如建表并且插入数据用2个

2.2、无特性建表


假如我们的实体不需求加特性,那么我们能够经过特性方式建表


SugarClient db = newSqlSugarClient( newConnectionConfig


{


DbType = DbType.SqlServer,


ConnectionString = Config.ConnectionString3,


InitKeyType = InitKeyType.Attribute,


IsAutoCloseConnection = true,


ConfigureExternalServices = newConfigureExternalServices


{


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&& newNullabilityInfoContext


.Create(c).WriteState isNullabilityState.Nullable)


{


p.IsNullable = true;


}


}


}


});


//性能阐明:


//EntityService 相同实体只会执行一次性不需太操作


1.3、无实体建表


功用与实体建类一模一样,假如运用SqlSugar中间规范能够支持多个数据库一套代码建表


vartype = db.DynamicBuilder.CreateClass( "UnitEntityA",


newSugarTable


{


TableDeion = "表备注",


//DisabledUpdateAll=true 能够遏止更新只创建


}


)


.CreateProperty( "Id", typeof( int), newSugarColumn { IsPrimaryKey = true, IsIdentity = true, ColumnDeion = "列备注"})


.CreateProperty( "Name", typeof( string), newSugarColumn {Length= 200, ColumnDeion = "列备注"})


.BuilderType;


db.CodeFirst.InitTables(type);


三、数据库维护


SqlSugar有一套数据库维护API,并且能够很好的支持多种数据库,例如备份数据库等常用功用


//例1 获取一切表


vartables = db.DbMaintenance.GetTableInfoList( false); //true 走缓存 false不走缓存


foreach( vartable intables)


{


Console.WriteLine(table.Deion); //输出表信息


//获取列信息


//var columns=db.DbMaintenance.GetColumnInfosByTableName("表名",false);


}


//例2


db.DbMaintenance.IsAnyTable( "tablename", false) //考证表名能否缓存不走缓存


所以API


GetViewInfoList查询一切视图ListGetTableInfoList获取一切表,查询一切的表 (GetTableInfoList(能否缓存))ListGetColumnInfosByTableName获取列依据表名,获取字段,字段信息GetColumnInfosByTableName(表名,能否缓存)ListGetIsIdentities获取自增列ListGetPrimaries获取主键ListIsAnyTable表能否存在,判别表存不存在 ( IsAny(表名,能否缓存))boolIsAnyColumn列能否存在boolIsPrimaryKey主键能否存在boolIsIdentity自增能否存在boolIsAnyConstraint约束能否存在boolDropTable删除表boolTruncateTable清空表boolCreateTable看题目 1.1,1.2,1.3boolAddColumn添加列boolUpdateColumn更新列boolAddPrimaryKey添加主键boolDropConstraint删除约束boolBackupDataBase备份库boolDropColumn删除列boolRenameColumn重命名列boolAddDefaultValue添加默许值boolAddTableRemark添加表描画,表注释boolAddColumnRemark添加列描画,表注释boolDeleteColumnRemark删除列描画,表注释boolRenameTable重命名表boolCreateIndex创建索引,独一约束(独一索引)boolIsAnyIndex索引能否存在boolGetIndexList获取一切索引GetProcList获取一切存储过程

四、跨库支持


实体


[ TenantAttribute( "1") ] //对应ConfigId


publicclassC1Table


{


publicstringId { get; set; }


}


[ TenantAttribute( "2") ]


publicclassC2Table


{


publicstringId { get; set; }


}


查询//经过ConfigId进行数据库分辨


vardb = newSqlSugarClient( newList<ConnectionConfig>


{


//这儿声名一切上下文都生效


newConnectionConfig{ConfigId= "0",DbType=DbType.SqlServer,ConnectionString=..,IsAutoCloseConnection= true},


newConnectionConfig{ConfigId= "1",DbType=DbType.MySql,ConnectionString=..,IsAutoCloseConnection= true}


});


//自动跨库联表查询


varquery5 = db.QueryableWithAttr<Order> //假如MySql和SqlServer自动支持同效劳器的跨库联表查询


.LeftJoin<Custom> ((o, cus ) => o.CustomId == cus.Id) //多个条件用&&


.LeftJoin<OrderDetail> ((o, cus, oritem) => o.Id == oritem.OrderId)


.Where(o => o.Id == 1)


.Select((o, cus , oritem) => newViewOrder { Id = o.Id, CustomName = cus.Name })


.ToList;


//手动跨库联表查询 ,这种方式分离dblink能够跨效劳器


varquery5 = db.Queryable.As( "xxx.表名")


.LeftJoin<Custom> ((o, cus ) => o.CustomId == cus.Id , "yyyy.表名")


.LeftJoin<OrderDetail> ((o, cus, oritem) => o.Id == oritem.OrderId , "zzzz.名表")


.Where(o => o.Id == 1)


.Select((o, cus , oritem) => newViewOrder { Id = o.Id, CustomName = cus.Name })


.ToList;


插入db.InsertableWithAttr(list).Execommand


更新db.UpdateableWithAttr(list).Execommand


删除db.UpdateableWithAttr(list).Execommand


只需实体配置了数据库,就不要思索换库了,直接运用,并且支持事务


四、过滤器


SqlSugar支持了全新的过滤器,能够是接口,集成该接口的类都生效,支持多表查询


db.QueryFilter


.AddTableFilter<IDeletedFilter>(it => it.IsDeleted== false) //IDeletedFilter是自定义接口,继承这个接口的实体有效


.AddTableFilterIF<ITenantFilter>(isAdmint== false,it=>it.OrgId==用户OrgId); //ITenantFilter自定义接口


//用例1:单条语句清空,只影响当前语句


db.Queryable<Order>.ClearFilter.ToList; //一切过滤器都无效


db.Queryable<Order>.ClearFilter<IDeletedFilter>.ToList; //只需IDeletedFilter过滤器无效


db.Queryable<Order>.ClearFilter<IDeletedFilter,ITenantFilter>.ToList; //IDeletedFilter+ITenantFilter无效


//用例2:当前上下文清空 ,不会影响其他央求,只是当前央求清空


db.QueryFilter.Clear;


db.QueryFilter.Clear<IDeletedFilter>;


//用例3:清空并恢复 ,不会影响其他央求,只是当前央求清空


db.QueryFilter.ClearAndBackup; //有多个重载 ClearAndBackup<T,T2>;


db.Queryable<Order>.ToList;


db.QueryFilter.Restore; //恢复过滤器 (合适下面代码还需求过滤器状况)


五、子查询升级


1、ToList 能够直接查询一个对象


2、First 能够直接查单个对象


3、ToList(it=>it.Id) 能够查List< int >一个字段汇合


4、SelectStringJoin(z => z.Name, ",") 子查询将一列用逗号拼接成字符串


varlist=db.Queryable< Order >


.Select(it => new


{


CustomId = it.CustomId,


OrderId = it.Id,


OrderName = it.Name,


CustomList = SqlFunc.Subqueryable< Custom >.Where(c => c.Id == it.CustomId).ToList


})


.ToList;


六、自定义类型支持自定义类型转换器


下面只是解说怎样定义转换器,ORM自带的功用就包含下面功用,只是用来解说


publicclassDictionaryConvert: ISugarDataConverter


{


publicSugarParameter ParameterConverter<T>( objectvalue, inti)


{


//该功用ORM自带的IsJson就能完成这里只是用这个用例来给大家学习


varname = "@myp"+ i;


varstr = newSerializeService.SerializeObject( value);


returnnewSugarParameter(name, str);


}


publicT QueryConverter<T>(IDataRecord dr, inti)


{


//打断点调试


//该功用ORM自带的IsJson就能完成这里只是用这个用例来给大家学习


varstr = dr.GetValue(i) + "";


returnnewSerializeService.DeserializeObject<T>(str);


}


}


//运用自定义转换器


[ SugarColumn(ColumnDataType= "varchar(2000)",SqlParameterDbType=typeof(DictionaryConvert)) ]


publicDictionary< string, object> DcValue { get; set; } //5.1.3.53-preview08


现有类型支持


json类型


https://www.donet5.com/Home/Doc?typeId=1232


枚举类型


int存储:直接用就行了


publicDbType DcValue { get; set; }


string存储:高版本如下写法


[ SugarColumn(ColumnDataType= "varchar(20)",SqlParameterDbType=typeof(EnumToStringConvert)) ]


publicDbType DcValue { get; set; }


3、数据库独有类型支持


看左边菜单 【数据库特性】 该菜单下面有 SqlServer菜单或者MySql菜单等,针对不同数据库都有特地的引见


总结


SqlSugar在2021年到2022年大量的开源应用运用了SqlSugar,带动了SqlSugar的快速延展,我这边要感激大家


Admin.NET通用管理平台


ZrAdminNetCore 后台


管理Yi框架(Ruoyi Vue)


SimpleAdmin (new)


vboot-netmagic.net (Vue2.0)


网关采集系统(Blazor)


RuYiAdmin


CoreShop商城


Blog.Core


YuebonCore


企业级框架Furion


WebFirst


腾讯APIJSON.NET


WaterCloud微效劳


ViperFamilyBucket应用框架通用后台


SmartSqlWMS仓库管理系统a


pevolo-apiFytSoaCms


开源项目


https://www.donet5.com/Home/Doc?typeId=1215


转自:果糖大数据科技


- EOF -


点击题目可跳转


.NET 6.0+Vue3搭建书签管理项目


.NET 升级利器:Upgrade Assistant


Sql Server 高并发的状况下,如何应用锁保障数据的稳定性


看完本文有收获?请转发分享给更多人


引荐关注「DotNet」,提升.Net技艺


点赞和在看就是最大的支持


引荐关注↓


一、创建表


SqlSugar支持了3种方式的建表(无实体建表、实体建表,实体特性建表),十分的灵活


能够多个数据库 MYSQL MSSQL ORACLE SQLITE PGSQL 等用同一语法创建数据库,不需求思索数据库的兼容性


中间规范:


string 大文本5.1.3.44-preview06 引荐[SugarColumn(ColumnDataType = StaticConfig.CodeFirst_BigString)]称号描画GetDataBaseList获取一切数据库称号List

路过

雷人

握手

鲜花

鸡蛋
已有 0 人参与

会员评论

 名表回收网手机版

官网微博:名表回收网服务平台

今日头条二维码 1 微信公众号二维码 1 抖音小程序二维码 1
浙江速典奢贸易有限公司 网站经营许可证 备案号:浙ICP备19051835号2012-2022
名表回收网主要专注于手表回收,二手名表回收/销售业务,可免费鉴定(手表真假),评估手表回收价格,正规手表回收公司,浙江实体店,支持全国范围上门回收手表
返回顶部