对于 CRUD来说只需要配置主键和自增列就行了 ,如果类的名称和数据库不一样可以设置数据库中的名称
主键自增
[SugarTable("dbstudent")]//当和数据库名称不一样可以设置表别名 指定表明 public class Student { [SugarColumn(IsPrimaryKey = true, IsIdentity = true)]//数据库是自增才配自增 public int Id { get; set; } public int? SchoolId { get; set; } [SugarColumn(ColumnName ="StudentName")]//数据库与实体不一样设置列名 public string Name { get; set; } }
双主键、复合主键、联合主键、多个主键
表中字段 如果是自增需要加上 IsIdentity,否则不需要
public class Student { [SugarColumn(IsPrimaryKey = true)] //设置主键 public Guid Pk1{ get; set; } [SugarColumn(IsPrimaryKey = true)] //设置主键 public Guid Pk2{ get; set; } public string Name { get; set; } }
无主键
当表中无主键的时候更新和删除,需要指定条件,具体用法看文档
public class Student { public Guid Id{ get; set; } public string Name { get; set; } }
总结:只需要针对数据库中的 自增和主键进行设置即可,和数据库一致
下面是CRUD用到的特性,不包含建表的属性 (建表看文档【迁移】)
IsIdentity | 是自增列 如果是Oracle12+需要启用看文档: Oracle 如果是Oracle11及以下请设置OracleSequenceName 设置后和自增一样使用 |
IsPrimaryKey | true是主键 |
ColumnName | 实体类数据库列名不一样设置数据库列名 |
IsIgnore | IsIgnore=true表示 ORM 所有操作不处理这列 一般用于数据库没有这一列 ORM 非数据库列加上该特性(配置导航查询自动IsIgnore=true) |
IsOnlyIgnoreInsert | 插入操作时不处理该列 【插入中忽略】 对数据库默认值有效 |
IsOnlyIgnoreUpdate | 更新操作不处理该列 【更新中忽略】 |
InsertServerTime | 插入操作:true数据库时间 |
UpdateServerTime | 更新操作:true数据库时间 |
InsertSql | 插入根据SQL 等于"0"插入0 等 于"'a'" 插入a 等于 "newid()" 插入newid() 5.1.4.151支持了格式化 "数据库函数('{0}')" |
UpdateSql | 更新根据SQL 等于"0"更新0 等 于"'a'" 更新a 等于 "newid()" 更新newid() 5.1.4.151支持了格式化 "数据库函数('{0}')" |
QuerySql 5.1.4.128+ | 用于单表查询在没有使用Select下根据Sql生成 例如等于" Cast( Num_float64 as varchar(500))" 生成的Sql : Cast( Num_float64 as varchar(500)) AS Num_float64 一般用于orm驱动不支持的类型并且自定义类型也失效的情况 只在单表查询,不使用Select的情况下才生效 注意: 联表或者SELECT使用 函数或者扩展函数实现 |
OracleSequenceName | 设置Oracle序列,设置后该列等同于自增列 ,看文档: Oracle |
MaxParameterNameLength | 一般等于30,用于处理Oracle11 :参数化名字和索引名字超过30 |
建表看文档【迁移】,这边只介绍CRUD用到的属性
下面是实现自定义特性的例子
SqlSugarClient db = new SqlSugarClient(new ConnectionConfig() { ConnectionString = Config.ConnectionString, DbType = DbType.SqlServer, IsAutoCloseConnection = true, ConfigureExternalServices = new ConfigureExternalServices() { EntityService = (property, column) => { var attributes = property.GetCustomAttributes(true);//get all attributes if (attributes.Any(it => it is KeyAttribute))// by attribute set primarykey { column.IsPrimarykey = true; //有哪些特性可以看 1.2 特性明细 } //可以写多个,这边可以断点调试 // if (attributes.Any(it => it is NotMappedAttribute)) //{ // column.IsIgnore= true; //} }, EntityNameService = (type, entity) => { var attributes = type.GetCustomAttributes(true); if (attributes.Any(it => it is TableAttribute)) { var attr=(attributes.First(it=>it is TableAttribute) as TableAttribute); entity.DbTableName = attr.Name; } } } }); [Table("student")] //[SugarTable("student")] public class MyStudent { [Key] //[SugarColumn(IsPrimaryKey =true)] public string Id { get; set; } public string Name { get; set; } }
该功能非常强大远不止这点用法,可以统一处理一些特性逻辑
分享你们的自定义特性实现:
1、方便其它人使用
2、方便自已使用
分享地址: http://www.donet5.com/Ask/9/11065
根据规则来设置哪个是主键,哪个是自增,这样就不需要在实体加特性了(SqlSugar只需主键和自增就可以完成所有操作)
var db= new SqlSugarClient(new ConnectionConfig() { DbType = SqlSugar.DbType.MySql, ConnectionString = Config.ConnectionString, IsAutoCloseConnection = true, ConfigureExternalServices=new ConfigureExternalServices() { EntityService = (t, column) => { if (column.PropertyName.ToLower() == "id") //是id的设为主键 { column.IsPrimarykey = true; if (column.PropertyInfo.PropertyType == typeof(int)) //是id并且是int的是自增 { column.IsIdentity = true; } } } , EntityNameService = (type, entity) => { //entity.DbTableName 修改表名 } } }); //根据你自个的逻辑去设置相应的主键和自增,也可以从数据库读出主键和自增来动态设置 //db.DbMaintenance.GetColumnInfosByTableName 可以拿到表的信息
如果大量if else比较难看所以针对指定表进行了一些封
类似 fluent api
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 if(p.IsPrimaryKey==false&&new NullabilityInfoContext() .Create(c).WriteState is NullabilityState.Nullable) { p.IsNullable = true; } }, EntityNameService = (type, entity) => { //entity.DbTableName 修改表名 } } }); //性能说明: //EntityService 相同实体只会执行一次性不需太操作
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));
详细文档:https://www.donet5.com/Home/Doc?typeId=1206
//.net6以下 db.DbFirst.IsCreateAttribute().CreateClassFile("c:\\Demo\\1", "Models"); //.net6以上 string加? db.DbFirst.IsCreateAttribute().StringNullable().CreateClassFile("c:\\Demo\\1", "Models");
详细文档:https://www.donet5.com/Home/Doc?typeId=1207
不要使用 required ,通过下面写法实现
public class Order { [SqlSugar.SugarColumn(IsPrimaryKey = true, IsIdentity = true)] public int Id { get; set; } public string Name { get; set; } = null!;//这样写 }
2016 © donet5.comApache Licence 2.0