- 优化 MaxLength 功能,并且增加 [Column(StringLength = 100)] 同等的特性功能;

This commit is contained in:
28810 2019-12-05 21:23:29 +08:00
parent 05cf13f560
commit 5984292043
7 changed files with 122 additions and 36 deletions

View File

@ -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>
添加 添加

View File

@ -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; }
} }
} }

View File

@ -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;
}
} }
} }

View File

@ -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>

View File

@ -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;
}
}
} }
} }
}); });

View File

@ -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;
} }

View File

@ -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} 重复存在,请检查(注意:不区分大小写)");