mirror of
https://github.com/nsnail/FreeSql.git
synced 2025-04-22 18:52:50 +08:00
- 优化 MaxLength 功能,并且增加 [Column(StringLength = 100)] 同等的特性功能;
This commit is contained in:
parent
05cf13f560
commit
5984292043
@ -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} 重复存在,请检查(注意:不区分大小写)");
|
||||||
|
Loading…
x
Reference in New Issue
Block a user