From bddcf9c0bc3406ba84f7d27f2c74c5ba43f708f9 Mon Sep 17 00:00:00 2001 From: 28810 <28810@YEXIANGQIN> Date: Wed, 11 Sep 2019 20:40:52 +0800 Subject: [PATCH] =?UTF-8?q?-=20=E5=A2=9E=E5=8A=A0=20MaxLength=20=E7=89=B9?= =?UTF-8?q?=E6=80=A7=E7=9A=84=E8=A7=A3=E6=9E=90=EF=BC=8C=E5=AE=9E=E4=BD=93?= =?UTF-8?q?=E5=AD=97=E7=AC=A6=E4=B8=B2=E9=95=BF=E5=BA=A6=E8=AE=BE=E7=BD=AE?= =?UTF-8?q?=EF=BC=9B?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Examples/base_entity/Entities/User.cs | 5 +++ Examples/orm_vs/Program.cs | 4 +- FreeSql/DataAnnotations/ColumnAttribute.cs | 7 ++-- FreeSql/FreeSql.xml | 2 +- FreeSql/FreeSqlBuilder.cs | 49 +++++++++++++++++++--- 5 files changed, 56 insertions(+), 11 deletions(-) diff --git a/Examples/base_entity/Entities/User.cs b/Examples/base_entity/Entities/User.cs index 687feb55..7e7d741f 100644 --- a/Examples/base_entity/Entities/User.cs +++ b/Examples/base_entity/Entities/User.cs @@ -1,6 +1,7 @@ using FreeSql; using System; using System.Collections.Generic; +using System.ComponentModel.DataAnnotations; public class UserGroup : BaseEntity { @@ -35,20 +36,24 @@ public class User1 : BaseEntity /// /// 登陆名 /// + [MaxLength(32)] public string Username { get; set; } /// /// 昵称 /// + [MaxLength(64)] public string Nickname { get; set; } /// /// 头像 /// + [MaxLength(1024)] public string Avatar { get; set; } /// /// 描述 /// + [MaxLength(4000)] public string Description { get; set; } } diff --git a/Examples/orm_vs/Program.cs b/Examples/orm_vs/Program.cs index 6530eb3e..ee8470db 100644 --- a/Examples/orm_vs/Program.cs +++ b/Examples/orm_vs/Program.cs @@ -54,7 +54,7 @@ namespace orm_vs { testlist2.AddRange(list); }); - + fsql.CodeFirst.SyncStructure(typeof(Song), typeof(Song_tag), typeof(Tag)); //sugar.CodeFirst.InitTables(typeof(Song), typeof(Song_tag), typeof(Tag)); //sugar创建表失败:SqlSugar.SqlSugarException: Sequence contains no elements @@ -76,7 +76,7 @@ namespace orm_vs Insert(sb, 1000, 10); Console.Write(sb.ToString()); sb.Clear(); - + Insert(sb, 1, 1000); Console.Write(sb.ToString()); sb.Clear(); diff --git a/FreeSql/DataAnnotations/ColumnAttribute.cs b/FreeSql/DataAnnotations/ColumnAttribute.cs index 11a2d1c1..21dede2d 100644 --- a/FreeSql/DataAnnotations/ColumnAttribute.cs +++ b/FreeSql/DataAnnotations/ColumnAttribute.cs @@ -15,7 +15,8 @@ namespace FreeSql.DataAnnotations /// public string OldName { get; set; } /// - /// 数据库类型,如: varchar(255) + /// 数据库类型,如: varchar(255) + /// 字符串长度,可使用特性 MaxLength(255) /// public string DbType { get; set; } @@ -82,7 +83,7 @@ namespace FreeSql.DataAnnotations internal short? _Position; /// - /// 创建表时字段位置,规则如下: + /// 创建表时字段的位置(场景:实体继承后设置字段顺序),规则如下: /// /// >0时排前面,1,2,3... /// @@ -91,5 +92,5 @@ namespace FreeSql.DataAnnotations /// <0时排后面,...-3,-2,-1 /// public short Position { get => _Position ?? 0; set => _Position = value; } -} + } } diff --git a/FreeSql/FreeSql.xml b/FreeSql/FreeSql.xml index db077ae2..17f09e39 100644 --- a/FreeSql/FreeSql.xml +++ b/FreeSql/FreeSql.xml @@ -61,7 +61,7 @@ - 创建表时字段位置,规则如下: + 创建表时字段的位置(场景:实体继承后设置字段顺序),规则如下: >0时排前面,1,2,3... diff --git a/FreeSql/FreeSqlBuilder.cs b/FreeSql/FreeSqlBuilder.cs index 3235583c..55253b7b 100644 --- a/FreeSql/FreeSqlBuilder.cs +++ b/FreeSql/FreeSqlBuilder.cs @@ -181,31 +181,31 @@ namespace FreeSql switch (_entityPropertyConvertType) { case StringConvertType.Lower: - ret.Aop.ConfigEntityProperty = (s, e) => + ret.Aop.ConfigEntityProperty += (s, e) => { e.ModifyResult.Name = e.Property.Name.ToLower(); }; break; case StringConvertType.Upper: - ret.Aop.ConfigEntityProperty = (s, e) => + ret.Aop.ConfigEntityProperty += (s, e) => { e.ModifyResult.Name = e.Property.Name.ToUpper(); }; break; case StringConvertType.PascalCaseToUnderscore: - ret.Aop.ConfigEntityProperty = (s, e) => + ret.Aop.ConfigEntityProperty += (s, e) => { e.ModifyResult.Name = StringUtils.PascalCaseToUnderScore(e.Property.Name); }; break; case StringConvertType.PascalCaseToUnderscoreWithLower: - ret.Aop.ConfigEntityProperty = (s, e) => + ret.Aop.ConfigEntityProperty += (s, e) => { e.ModifyResult.Name = StringUtils.PascalCaseToUnderScore(e.Property.Name).ToLower(); }; break; case StringConvertType.PascalCaseToUnderscoreWithUpper: - ret.Aop.ConfigEntityProperty = (s, e) => + ret.Aop.ConfigEntityProperty += (s, e) => { e.ModifyResult.Name = StringUtils.PascalCaseToUnderScore(e.Property.Name).ToUpper(); }; @@ -214,6 +214,45 @@ namespace FreeSql break; } } + //处理 MaxLength + ret.Aop.ConfigEntityProperty += new EventHandler((s, e) => + { + object[] attrs = null; + try + { + attrs = e.Property.GetCustomAttributes(false).ToArray(); //.net core 反射存在版本冲突问题,导致该方法异常 + } + catch { } + + var maxlenAttr = attrs.Where(a => { + return ((a as Attribute)?.TypeId as Type)?.Name == "MaxLengthAttribute"; + }).FirstOrDefault(); + if (maxlenAttr != null) + { + var lenProp = maxlenAttr.GetType().GetProperties().Where(a => a.PropertyType.IsNumberType()).FirstOrDefault(); + if (lenProp != null && int.TryParse(string.Concat(lenProp.GetValue(maxlenAttr, null)), out var tryval) && tryval > 0) + { + switch (ret.Ado.DataType) + { + case DataType.MySql: + e.ModifyResult.DbType = $"varchar({tryval})"; + break; + case DataType.SqlServer: + e.ModifyResult.DbType = $"nvarchar({tryval})"; + break; + case DataType.PostgreSQL: + e.ModifyResult.DbType = $"varchar({tryval})"; + break; + case DataType.Oracle: + e.ModifyResult.DbType = $"nvarchar2({tryval})"; + break; + case DataType.Sqlite: + e.ModifyResult.DbType = $"nvarchar({tryval})"; + break; + } + } + } + }); } return ret;