mirror of
				https://github.com/nsnail/FreeSql.git
				synced 2025-11-04 09:15:27 +08:00 
			
		
		
		
	- 优化 MaxLength 功能,并且增加 [Column(StringLength = 100)] 同等的特性功能;
This commit is contained in:
		@@ -110,13 +110,6 @@
 | 
				
			|||||||
            清空状态数据
 | 
					            清空状态数据
 | 
				
			||||||
            </summary>
 | 
					            </summary>
 | 
				
			||||||
        </member>
 | 
					        </member>
 | 
				
			||||||
        <member name="M:FreeSql.DbSet`1.RemoveAsync(System.Linq.Expressions.Expression{System.Func{`0,System.Boolean}})">
 | 
					 | 
				
			||||||
            <summary>
 | 
					 | 
				
			||||||
            根据 lambda 条件删除数据
 | 
					 | 
				
			||||||
            </summary>
 | 
					 | 
				
			||||||
            <param name="predicate"></param>
 | 
					 | 
				
			||||||
            <returns></returns>
 | 
					 | 
				
			||||||
        </member>
 | 
					 | 
				
			||||||
        <member name="M:FreeSql.DbSet`1.Add(`0)">
 | 
					        <member name="M:FreeSql.DbSet`1.Add(`0)">
 | 
				
			||||||
            <summary>
 | 
					            <summary>
 | 
				
			||||||
            添加
 | 
					            添加
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -17,7 +17,7 @@ namespace FreeSql.DataAnnotations
 | 
				
			|||||||
        public string OldName { get; set; }
 | 
					        public string OldName { get; set; }
 | 
				
			||||||
        /// <summary>
 | 
					        /// <summary>
 | 
				
			||||||
        /// 数据库类型,如: varchar(255) <para></para>
 | 
					        /// 数据库类型,如: varchar(255) <para></para>
 | 
				
			||||||
        /// 字符串长度,可使用特性 MaxLength(255)
 | 
					        /// 字符串长度,可使用特性 [MaxLength(255)]
 | 
				
			||||||
        /// </summary>
 | 
					        /// </summary>
 | 
				
			||||||
        public string DbType { get; set; }
 | 
					        public string DbType { get; set; }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@@ -76,5 +76,26 @@ namespace FreeSql.DataAnnotations
 | 
				
			|||||||
        /// 标记属性为数据库服务器时间(utc/local),在插入的时候使用类似 getdate() 执行
 | 
					        /// 标记属性为数据库服务器时间(utc/local),在插入的时候使用类似 getdate() 执行
 | 
				
			||||||
        /// </summary>
 | 
					        /// </summary>
 | 
				
			||||||
        public DateTimeKind ServerTime { get; set; }
 | 
					        public DateTimeKind ServerTime { get; set; }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        internal int? _StringLength;
 | 
				
			||||||
 | 
					        /// <summary>
 | 
				
			||||||
 | 
					        /// 设置长度,针对 string 类型避免 DbType 的繁琐设置<para></para>
 | 
				
			||||||
 | 
					        /// 提示:也可以使用 [MaxLength(100)]<para></para>
 | 
				
			||||||
 | 
					        /// ---<para></para>
 | 
				
			||||||
 | 
					        /// StringLength = 100 时,对应 DbType:<para></para>
 | 
				
			||||||
 | 
					        /// MySql -> varchar(100)<para></para>
 | 
				
			||||||
 | 
					        /// SqlServer -> nvarchar(100)<para></para>
 | 
				
			||||||
 | 
					        /// PostgreSQL -> varchar(100)<para></para>
 | 
				
			||||||
 | 
					        /// Oracle -> nvarchar2(100)<para></para>
 | 
				
			||||||
 | 
					        /// Sqlite -> nvarchar(100)<para></para>
 | 
				
			||||||
 | 
					        /// ---<para></para>
 | 
				
			||||||
 | 
					        /// StringLength = -1 时,对应 DbType:<para></para>
 | 
				
			||||||
 | 
					        /// MySql -> text<para></para>
 | 
				
			||||||
 | 
					        /// SqlServer -> nvarchar(max)<para></para>
 | 
				
			||||||
 | 
					        /// PostgreSQL -> text<para></para>
 | 
				
			||||||
 | 
					        /// Oracle -> nvarchar2(4000)<para></para>
 | 
				
			||||||
 | 
					        /// Sqlite -> text<para></para>
 | 
				
			||||||
 | 
					        /// </summary>
 | 
				
			||||||
 | 
					        public int StringLength { get => _StringLength ?? 0; set => _StringLength = value; }
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -135,5 +135,28 @@ namespace FreeSql.DataAnnotations
 | 
				
			|||||||
            _column.ServerTime = value;
 | 
					            _column.ServerTime = value;
 | 
				
			||||||
            return this;
 | 
					            return this;
 | 
				
			||||||
        }
 | 
					        }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        /// <summary>
 | 
				
			||||||
 | 
					        /// 设置长度,针对 string 类型避免 DbType 的繁琐设置<para></para>
 | 
				
			||||||
 | 
					        /// ---<para></para>
 | 
				
			||||||
 | 
					        /// StringLength = 100 时,对应 DbType:<para></para>
 | 
				
			||||||
 | 
					        /// MySql -> varchar(100)<para></para>
 | 
				
			||||||
 | 
					        /// SqlServer -> nvarchar(100)<para></para>
 | 
				
			||||||
 | 
					        /// PostgreSQL -> varchar(100)<para></para>
 | 
				
			||||||
 | 
					        /// Oracle -> nvarchar2(100)<para></para>
 | 
				
			||||||
 | 
					        /// Sqlite -> nvarchar(100)<para></para>
 | 
				
			||||||
 | 
					        /// ---<para></para>
 | 
				
			||||||
 | 
					        /// StringLength = -1 时,对应 DbType:<para></para>
 | 
				
			||||||
 | 
					        /// MySql -> text<para></para>
 | 
				
			||||||
 | 
					        /// SqlServer -> nvarchar(max)<para></para>
 | 
				
			||||||
 | 
					        /// PostgreSQL -> text<para></para>
 | 
				
			||||||
 | 
					        /// Oracle -> nvarchar2(4000)<para></para>
 | 
				
			||||||
 | 
					        /// Sqlite -> text<para></para>
 | 
				
			||||||
 | 
					        /// </summary>
 | 
				
			||||||
 | 
					        public ColumnFluent StringLength(int value)
 | 
				
			||||||
 | 
					        {
 | 
				
			||||||
 | 
					            _column.StringLength = value;
 | 
				
			||||||
 | 
					            return this;
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -17,7 +17,7 @@
 | 
				
			|||||||
        <member name="P:FreeSql.DataAnnotations.ColumnAttribute.DbType">
 | 
					        <member name="P:FreeSql.DataAnnotations.ColumnAttribute.DbType">
 | 
				
			||||||
            <summary>
 | 
					            <summary>
 | 
				
			||||||
            数据库类型,如: varchar(255) <para></para>
 | 
					            数据库类型,如: varchar(255) <para></para>
 | 
				
			||||||
            字符串长度,可使用特性 MaxLength(255)
 | 
					            字符串长度,可使用特性 [MaxLength(255)]
 | 
				
			||||||
            </summary>
 | 
					            </summary>
 | 
				
			||||||
        </member>
 | 
					        </member>
 | 
				
			||||||
        <member name="P:FreeSql.DataAnnotations.ColumnAttribute.IsPrimary">
 | 
					        <member name="P:FreeSql.DataAnnotations.ColumnAttribute.IsPrimary">
 | 
				
			||||||
@@ -78,6 +78,26 @@
 | 
				
			|||||||
            标记属性为数据库服务器时间(utc/local),在插入的时候使用类似 getdate() 执行
 | 
					            标记属性为数据库服务器时间(utc/local),在插入的时候使用类似 getdate() 执行
 | 
				
			||||||
            </summary>
 | 
					            </summary>
 | 
				
			||||||
        </member>
 | 
					        </member>
 | 
				
			||||||
 | 
					        <member name="P:FreeSql.DataAnnotations.ColumnAttribute.StringLength">
 | 
				
			||||||
 | 
					            <summary>
 | 
				
			||||||
 | 
					            设置长度,针对 string 类型避免 DbType 的繁琐设置<para></para>
 | 
				
			||||||
 | 
					            提示:也可以使用 [MaxLength(100)]<para></para>
 | 
				
			||||||
 | 
					            ---<para></para>
 | 
				
			||||||
 | 
					            StringLength = 100 时,对应 DbType:<para></para>
 | 
				
			||||||
 | 
					            MySql -> varchar(100)<para></para>
 | 
				
			||||||
 | 
					            SqlServer -> nvarchar(100)<para></para>
 | 
				
			||||||
 | 
					            PostgreSQL -> varchar(100)<para></para>
 | 
				
			||||||
 | 
					            Oracle -> nvarchar2(100)<para></para>
 | 
				
			||||||
 | 
					            Sqlite -> nvarchar(100)<para></para>
 | 
				
			||||||
 | 
					            ---<para></para>
 | 
				
			||||||
 | 
					            StringLength = -1 时,对应 DbType:<para></para>
 | 
				
			||||||
 | 
					            MySql -> text<para></para>
 | 
				
			||||||
 | 
					            SqlServer -> nvarchar(max)<para></para>
 | 
				
			||||||
 | 
					            PostgreSQL -> text<para></para>
 | 
				
			||||||
 | 
					            Oracle -> nvarchar2(4000)<para></para>
 | 
				
			||||||
 | 
					            Sqlite -> text<para></para>
 | 
				
			||||||
 | 
					            </summary>
 | 
				
			||||||
 | 
					        </member>
 | 
				
			||||||
        <member name="M:FreeSql.DataAnnotations.ColumnFluent.Name(System.String)">
 | 
					        <member name="M:FreeSql.DataAnnotations.ColumnFluent.Name(System.String)">
 | 
				
			||||||
            <summary>
 | 
					            <summary>
 | 
				
			||||||
            数据库列名
 | 
					            数据库列名
 | 
				
			||||||
@@ -159,6 +179,25 @@
 | 
				
			|||||||
            <param name="value"></param>
 | 
					            <param name="value"></param>
 | 
				
			||||||
            <returns></returns>
 | 
					            <returns></returns>
 | 
				
			||||||
        </member>
 | 
					        </member>
 | 
				
			||||||
 | 
					        <member name="M:FreeSql.DataAnnotations.ColumnFluent.StringLength(System.Int32)">
 | 
				
			||||||
 | 
					            <summary>
 | 
				
			||||||
 | 
					            设置长度,针对 string 类型避免 DbType 的繁琐设置<para></para>
 | 
				
			||||||
 | 
					            ---<para></para>
 | 
				
			||||||
 | 
					            StringLength = 100 时,对应 DbType:<para></para>
 | 
				
			||||||
 | 
					            MySql -> varchar(100)<para></para>
 | 
				
			||||||
 | 
					            SqlServer -> nvarchar(100)<para></para>
 | 
				
			||||||
 | 
					            PostgreSQL -> varchar(100)<para></para>
 | 
				
			||||||
 | 
					            Oracle -> nvarchar2(100)<para></para>
 | 
				
			||||||
 | 
					            Sqlite -> nvarchar(100)<para></para>
 | 
				
			||||||
 | 
					            ---<para></para>
 | 
				
			||||||
 | 
					            StringLength = -1 时,对应 DbType:<para></para>
 | 
				
			||||||
 | 
					            MySql -> text<para></para>
 | 
				
			||||||
 | 
					            SqlServer -> nvarchar(max)<para></para>
 | 
				
			||||||
 | 
					            PostgreSQL -> text<para></para>
 | 
				
			||||||
 | 
					            Oracle -> nvarchar2(4000)<para></para>
 | 
				
			||||||
 | 
					            Sqlite -> text<para></para>
 | 
				
			||||||
 | 
					            </summary>
 | 
				
			||||||
 | 
					        </member>
 | 
				
			||||||
        <member name="T:FreeSql.DataAnnotations.ExpressionCallAttribute">
 | 
					        <member name="T:FreeSql.DataAnnotations.ExpressionCallAttribute">
 | 
				
			||||||
            <summary>
 | 
					            <summary>
 | 
				
			||||||
            自定义表达式函数解析<para></para>
 | 
					            自定义表达式函数解析<para></para>
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -263,34 +263,9 @@ namespace FreeSql
 | 
				
			|||||||
                    if (maxlenAttr != null)
 | 
					                    if (maxlenAttr != null)
 | 
				
			||||||
                    {
 | 
					                    {
 | 
				
			||||||
                        var lenProp = maxlenAttr.GetType().GetProperties().Where(a => a.PropertyType.IsNumberType()).FirstOrDefault();
 | 
					                        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))
 | 
					                        if (lenProp != null && int.TryParse(string.Concat(lenProp.GetValue(maxlenAttr, null)), out var tryval) && tryval != 0)
 | 
				
			||||||
                        {
 | 
					                        {
 | 
				
			||||||
                            if (tryval != 0)
 | 
					                            e.ModifyResult.StringLength = tryval;
 | 
				
			||||||
                            {
 | 
					 | 
				
			||||||
                                switch (ret.Ado.DataType)
 | 
					 | 
				
			||||||
                                {
 | 
					 | 
				
			||||||
                                    case DataType.MySql:
 | 
					 | 
				
			||||||
                                    case DataType.OdbcMySql:
 | 
					 | 
				
			||||||
                                        e.ModifyResult.DbType = tryval > 0 ? $"varchar({tryval})" : "text";
 | 
					 | 
				
			||||||
                                        break;
 | 
					 | 
				
			||||||
                                    case DataType.SqlServer:
 | 
					 | 
				
			||||||
                                    case DataType.OdbcSqlServer:
 | 
					 | 
				
			||||||
                                        e.ModifyResult.DbType = tryval > 0 ? $"nvarchar({tryval})" : "nvarchar(max)";
 | 
					 | 
				
			||||||
                                        break;
 | 
					 | 
				
			||||||
                                    case DataType.PostgreSQL:
 | 
					 | 
				
			||||||
                                    case DataType.OdbcPostgreSQL:
 | 
					 | 
				
			||||||
                                        e.ModifyResult.DbType = tryval > 0 ? $"varchar({tryval})" : "text";
 | 
					 | 
				
			||||||
                                        break;
 | 
					 | 
				
			||||||
                                    case DataType.Oracle:
 | 
					 | 
				
			||||||
                                    case DataType.OdbcOracle:
 | 
					 | 
				
			||||||
                                        e.ModifyResult.DbType = tryval > 0 ? $"nvarchar2({tryval})" : "nvarchar2(4000)";
 | 
					 | 
				
			||||||
                                        break;
 | 
					 | 
				
			||||||
                                    case DataType.Sqlite:
 | 
					 | 
				
			||||||
                                        e.ModifyResult.DbType = tryval > 0 ? $"nvarchar({tryval})" : "text";
 | 
					 | 
				
			||||||
                                        break;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
                                }
 | 
					 | 
				
			||||||
                            }
 | 
					 | 
				
			||||||
                        }
 | 
					                        }
 | 
				
			||||||
                    }
 | 
					                    }
 | 
				
			||||||
                });
 | 
					                });
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -129,6 +129,7 @@ namespace FreeSql.Internal
 | 
				
			|||||||
                if (trycol._CanInsert != null) attr._CanInsert = trycol.CanInsert;
 | 
					                if (trycol._CanInsert != null) attr._CanInsert = trycol.CanInsert;
 | 
				
			||||||
                if (trycol._CanUpdate != null) attr._CanUpdate = trycol.CanUpdate;
 | 
					                if (trycol._CanUpdate != null) attr._CanUpdate = trycol.CanUpdate;
 | 
				
			||||||
                if (trycol.ServerTime != DateTimeKind.Unspecified) attr.ServerTime = trycol.ServerTime;
 | 
					                if (trycol.ServerTime != DateTimeKind.Unspecified) attr.ServerTime = trycol.ServerTime;
 | 
				
			||||||
 | 
					                if (trycol._StringLength != null) attr.StringLength = trycol.StringLength;
 | 
				
			||||||
            }
 | 
					            }
 | 
				
			||||||
            var attrs = proto.GetCustomAttributes(typeof(ColumnAttribute), false);
 | 
					            var attrs = proto.GetCustomAttributes(typeof(ColumnAttribute), false);
 | 
				
			||||||
            foreach (var tryattrobj in attrs)
 | 
					            foreach (var tryattrobj in attrs)
 | 
				
			||||||
@@ -148,6 +149,7 @@ namespace FreeSql.Internal
 | 
				
			|||||||
                if (tryattr._CanInsert != null) attr._CanInsert = tryattr.CanInsert;
 | 
					                if (tryattr._CanInsert != null) attr._CanInsert = tryattr.CanInsert;
 | 
				
			||||||
                if (tryattr._CanUpdate != null) attr._CanUpdate = tryattr.CanUpdate;
 | 
					                if (tryattr._CanUpdate != null) attr._CanUpdate = tryattr.CanUpdate;
 | 
				
			||||||
                if (tryattr.ServerTime != DateTimeKind.Unspecified) attr.ServerTime = tryattr.ServerTime;
 | 
					                if (tryattr.ServerTime != DateTimeKind.Unspecified) attr.ServerTime = tryattr.ServerTime;
 | 
				
			||||||
 | 
					                if (tryattr._StringLength != null) attr.StringLength = tryattr.StringLength;
 | 
				
			||||||
            }
 | 
					            }
 | 
				
			||||||
            ColumnAttribute ret = null;
 | 
					            ColumnAttribute ret = null;
 | 
				
			||||||
            if (!string.IsNullOrEmpty(attr.Name)) ret = attr;
 | 
					            if (!string.IsNullOrEmpty(attr.Name)) ret = attr;
 | 
				
			||||||
@@ -163,6 +165,7 @@ namespace FreeSql.Internal
 | 
				
			|||||||
            if (attr._CanInsert != null) ret = attr;
 | 
					            if (attr._CanInsert != null) ret = attr;
 | 
				
			||||||
            if (attr._CanUpdate != null) ret = attr;
 | 
					            if (attr._CanUpdate != null) ret = attr;
 | 
				
			||||||
            if (attr.ServerTime != DateTimeKind.Unspecified) ret = attr;
 | 
					            if (attr.ServerTime != DateTimeKind.Unspecified) ret = attr;
 | 
				
			||||||
 | 
					            if (attr._StringLength != null) ret = attr;
 | 
				
			||||||
            if (ret != null && ret.MapType == null) ret.MapType = proto.PropertyType;
 | 
					            if (ret != null && ret.MapType == null) ret.MapType = proto.PropertyType;
 | 
				
			||||||
            return ret;
 | 
					            return ret;
 | 
				
			||||||
        }
 | 
					        }
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -194,6 +194,38 @@ namespace FreeSql.Internal
 | 
				
			|||||||
                    col.DbDefaultValue = colattr.ServerTime == DateTimeKind.Local ? common.Now : common.NowUtc;
 | 
					                    col.DbDefaultValue = colattr.ServerTime == DateTimeKind.Local ? common.Now : common.NowUtc;
 | 
				
			||||||
                    col.DbInsertValue = colattr.ServerTime == DateTimeKind.Local ? common.Now : common.NowUtc;
 | 
					                    col.DbInsertValue = colattr.ServerTime == DateTimeKind.Local ? common.Now : common.NowUtc;
 | 
				
			||||||
                }
 | 
					                }
 | 
				
			||||||
 | 
					                if (colattr.MapType == typeof(string) && colattr.StringLength != 0)
 | 
				
			||||||
 | 
					                {
 | 
				
			||||||
 | 
					                    int strlen = colattr.StringLength;
 | 
				
			||||||
 | 
					                    var charPatten = @"(CHAR|CHAR2|CHARACTER)\s*(\([^\)]*\))?";
 | 
				
			||||||
 | 
					                    switch (common._orm.Ado.DataType)
 | 
				
			||||||
 | 
					                    {
 | 
				
			||||||
 | 
					                        case DataType.MySql:
 | 
				
			||||||
 | 
					                        case DataType.OdbcMySql:
 | 
				
			||||||
 | 
					                            if (strlen < 0) colattr.DbType = "text";
 | 
				
			||||||
 | 
					                            else colattr.DbType = Regex.Replace(colattr.DbType, charPatten, $"$1({strlen})");
 | 
				
			||||||
 | 
					                            break;
 | 
				
			||||||
 | 
					                        case DataType.SqlServer:
 | 
				
			||||||
 | 
					                        case DataType.OdbcSqlServer:
 | 
				
			||||||
 | 
					                            if (strlen < 0) colattr.DbType = Regex.Replace(colattr.DbType, charPatten, $"$1(MAX)");
 | 
				
			||||||
 | 
					                            else colattr.DbType = Regex.Replace(colattr.DbType, charPatten, $"$1({strlen})");
 | 
				
			||||||
 | 
					                            break;
 | 
				
			||||||
 | 
					                        case DataType.PostgreSQL:
 | 
				
			||||||
 | 
					                        case DataType.OdbcPostgreSQL:
 | 
				
			||||||
 | 
					                            if (strlen < 0) colattr.DbType = "text";
 | 
				
			||||||
 | 
					                            else colattr.DbType = Regex.Replace(colattr.DbType, charPatten, $"$1({strlen})");
 | 
				
			||||||
 | 
					                            break;
 | 
				
			||||||
 | 
					                        case DataType.Oracle:
 | 
				
			||||||
 | 
					                        case DataType.OdbcOracle:
 | 
				
			||||||
 | 
					                            if (strlen < 0) colattr.DbType = Regex.Replace(colattr.DbType, charPatten, $"$1(4000)");
 | 
				
			||||||
 | 
					                            else colattr.DbType = Regex.Replace(colattr.DbType, charPatten, $"$1({strlen})");
 | 
				
			||||||
 | 
					                            break;
 | 
				
			||||||
 | 
					                        case DataType.Sqlite:
 | 
				
			||||||
 | 
					                            if (strlen < 0) colattr.DbType = "text";
 | 
				
			||||||
 | 
					                            else colattr.DbType = Regex.Replace(colattr.DbType, charPatten, $"$1({strlen})");
 | 
				
			||||||
 | 
					                            break;
 | 
				
			||||||
 | 
					                    }
 | 
				
			||||||
 | 
					                }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
                if (trytb.Columns.ContainsKey(colattr.Name)) throw new Exception($"ColumnAttribute.Name {colattr.Name} 重复存在,请检查(注意:不区分大小写)");
 | 
					                if (trytb.Columns.ContainsKey(colattr.Name)) throw new Exception($"ColumnAttribute.Name {colattr.Name} 重复存在,请检查(注意:不区分大小写)");
 | 
				
			||||||
                if (trytb.ColumnsByCs.ContainsKey(p.Name)) throw new Exception($"属性名 {p.Name} 重复存在,请检查(注意:不区分大小写)");
 | 
					                if (trytb.ColumnsByCs.ContainsKey(p.Name)) throw new Exception($"属性名 {p.Name} 重复存在,请检查(注意:不区分大小写)");
 | 
				
			||||||
 
 | 
				
			|||||||
		Reference in New Issue
	
	Block a user