mirror of
https://github.com/nsnail/FreeSql.git
synced 2025-04-22 10:42:52 +08:00
- 优化 MaxLength 功能,并且增加 [Column(StringLength = 100)] 同等的特性功能;
This commit is contained in:
parent
05cf13f560
commit
5984292043
@ -110,13 +110,6 @@
|
||||
清空状态数据
|
||||
</summary>
|
||||
</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)">
|
||||
<summary>
|
||||
添加
|
||||
|
@ -17,7 +17,7 @@ namespace FreeSql.DataAnnotations
|
||||
public string OldName { get; set; }
|
||||
/// <summary>
|
||||
/// 数据库类型,如: varchar(255) <para></para>
|
||||
/// 字符串长度,可使用特性 MaxLength(255)
|
||||
/// 字符串长度,可使用特性 [MaxLength(255)]
|
||||
/// </summary>
|
||||
public string DbType { get; set; }
|
||||
|
||||
@ -76,5 +76,26 @@ namespace FreeSql.DataAnnotations
|
||||
/// 标记属性为数据库服务器时间(utc/local),在插入的时候使用类似 getdate() 执行
|
||||
/// </summary>
|
||||
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;
|
||||
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">
|
||||
<summary>
|
||||
数据库类型,如: varchar(255) <para></para>
|
||||
字符串长度,可使用特性 MaxLength(255)
|
||||
字符串长度,可使用特性 [MaxLength(255)]
|
||||
</summary>
|
||||
</member>
|
||||
<member name="P:FreeSql.DataAnnotations.ColumnAttribute.IsPrimary">
|
||||
@ -78,6 +78,26 @@
|
||||
标记属性为数据库服务器时间(utc/local),在插入的时候使用类似 getdate() 执行
|
||||
</summary>
|
||||
</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)">
|
||||
<summary>
|
||||
数据库列名
|
||||
@ -159,6 +179,25 @@
|
||||
<param name="value"></param>
|
||||
<returns></returns>
|
||||
</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">
|
||||
<summary>
|
||||
自定义表达式函数解析<para></para>
|
||||
|
@ -263,34 +263,9 @@ namespace FreeSql
|
||||
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))
|
||||
if (lenProp != null && int.TryParse(string.Concat(lenProp.GetValue(maxlenAttr, null)), out var tryval) && tryval != 0)
|
||||
{
|
||||
if (tryval != 0)
|
||||
{
|
||||
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;
|
||||
|
||||
}
|
||||
}
|
||||
e.ModifyResult.StringLength = tryval;
|
||||
}
|
||||
}
|
||||
});
|
||||
|
@ -129,6 +129,7 @@ namespace FreeSql.Internal
|
||||
if (trycol._CanInsert != null) attr._CanInsert = trycol.CanInsert;
|
||||
if (trycol._CanUpdate != null) attr._CanUpdate = trycol.CanUpdate;
|
||||
if (trycol.ServerTime != DateTimeKind.Unspecified) attr.ServerTime = trycol.ServerTime;
|
||||
if (trycol._StringLength != null) attr.StringLength = trycol.StringLength;
|
||||
}
|
||||
var attrs = proto.GetCustomAttributes(typeof(ColumnAttribute), false);
|
||||
foreach (var tryattrobj in attrs)
|
||||
@ -148,6 +149,7 @@ namespace FreeSql.Internal
|
||||
if (tryattr._CanInsert != null) attr._CanInsert = tryattr.CanInsert;
|
||||
if (tryattr._CanUpdate != null) attr._CanUpdate = tryattr.CanUpdate;
|
||||
if (tryattr.ServerTime != DateTimeKind.Unspecified) attr.ServerTime = tryattr.ServerTime;
|
||||
if (tryattr._StringLength != null) attr.StringLength = tryattr.StringLength;
|
||||
}
|
||||
ColumnAttribute ret = null;
|
||||
if (!string.IsNullOrEmpty(attr.Name)) ret = attr;
|
||||
@ -163,6 +165,7 @@ namespace FreeSql.Internal
|
||||
if (attr._CanInsert != null) ret = attr;
|
||||
if (attr._CanUpdate != null) 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;
|
||||
return ret;
|
||||
}
|
||||
|
@ -194,6 +194,38 @@ namespace FreeSql.Internal
|
||||
col.DbDefaultValue = 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.ColumnsByCs.ContainsKey(p.Name)) throw new Exception($"属性名 {p.Name} 重复存在,请检查(注意:不区分大小写)");
|
||||
|
Loading…
x
Reference in New Issue
Block a user