From e69fc68f5dfa4d80ed94f317ed61ffee8e4664c2 Mon Sep 17 00:00:00 2001 From: 2881099 <2881099@qq.com> Date: Fri, 1 Dec 2023 10:03:38 +0800 Subject: [PATCH] =?UTF-8?q?-=20=E4=BF=AE=E5=A4=8D=20Column=20DbType=20?= =?UTF-8?q?=E4=B8=8E=20StringLength=20=E5=A4=9A=E6=AC=A1=E6=9B=BF=E6=8D=A2?= =?UTF-8?q?=E9=97=AE=E9=A2=98=EF=BC=9B?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- FreeSql.DbContext/FreeSql.DbContext.xml | 18 -------- FreeSql/Internal/UtilsExpressionTree.cs | 57 +++++++++++++++---------- 2 files changed, 35 insertions(+), 40 deletions(-) diff --git a/FreeSql.DbContext/FreeSql.DbContext.xml b/FreeSql.DbContext/FreeSql.DbContext.xml index 26522f10..594fbad3 100644 --- a/FreeSql.DbContext/FreeSql.DbContext.xml +++ b/FreeSql.DbContext/FreeSql.DbContext.xml @@ -733,15 +733,6 @@ - - - 根据Assembly扫描所有继承IEntityTypeConfiguration<T>的配置类 - - - - - - 创建普通数据上下文档对象 @@ -800,14 +791,5 @@ - - - 批量注入 Repository,可以参考代码自行调整 - - - - - - diff --git a/FreeSql/Internal/UtilsExpressionTree.cs b/FreeSql/Internal/UtilsExpressionTree.cs index 4e4ec68d..2befdb45 100644 --- a/FreeSql/Internal/UtilsExpressionTree.cs +++ b/FreeSql/Internal/UtilsExpressionTree.cs @@ -347,22 +347,26 @@ namespace FreeSql.Internal if (colattr.MapType.NullableTypeOrThis() == typeof(string) && colattr.StringLength != 0) { int strlen = colattr.StringLength; - var charPatten = @"(CHARACTER|CHAR2|CHAR)\s*(\([^\)]*\))?"; + var charPattern = @"(CHARACTER|CHAR2|CHAR)\s*(\([^\)]*\))?"; + var replaceCounter = 0; var strNotNull = colattr.IsNullable == false ? " NOT NULL" : ""; switch (common._orm.Ado.DataType) { case DataType.MySql: case DataType.OdbcMySql: case DataType.CustomMySql: - if (strlen == -2) colattr.DbType = $"LONGTEXT{strNotNull}"; - else if (strlen < 0) colattr.DbType = $"TEXT{strNotNull}"; - else colattr.DbType = Regex.Replace(colattr.DbType, charPatten, $"$1({strlen})"); + if (strlen == -2) colattr.DbType = $"LONGTEXT{strNotNull}"; + else if (strlen < 0) colattr.DbType = $"TEXT{strNotNull}"; + else colattr.DbType = Regex.Replace(colattr.DbType, charPattern, m => + replaceCounter++ == 0 ? $"{m.Groups[1].Value}({strlen})" : m.Groups[0].Value); break; case DataType.SqlServer: case DataType.OdbcSqlServer: case DataType.CustomSqlServer: - if (strlen < 0) colattr.DbType = Regex.Replace(colattr.DbType, charPatten, $"$1(MAX)"); - else colattr.DbType = Regex.Replace(colattr.DbType, charPatten, $"$1({strlen})"); + if (strlen < 0) colattr.DbType = Regex.Replace(colattr.DbType, charPattern, m => + replaceCounter++ == 0 ? $"{m.Groups[1].Value}(MAX)" : m.Groups[0].Value); + else colattr.DbType = Regex.Replace(colattr.DbType, charPattern, m => + replaceCounter++ == 0 ? $"{m.Groups[1].Value}({strlen})" : m.Groups[0].Value); break; case DataType.PostgreSQL: case DataType.OdbcPostgreSQL: @@ -371,39 +375,48 @@ namespace FreeSql.Internal case DataType.OdbcKingbaseES: case DataType.ShenTong: if (strlen < 0) colattr.DbType = $"TEXT{strNotNull}"; - else colattr.DbType = Regex.Replace(colattr.DbType, charPatten, $"$1({strlen})"); + else colattr.DbType = Regex.Replace(colattr.DbType, charPattern, m => + replaceCounter++ == 0 ? $"{m.Groups[1].Value}({strlen})" : m.Groups[0].Value); break; case DataType.Oracle: case DataType.CustomOracle: if (strlen < 0) colattr.DbType = $"NCLOB{strNotNull}"; //v1.3.2+ https://github.com/dotnetcore/FreeSql/issues/259 - else colattr.DbType = Regex.Replace(colattr.DbType, charPatten, $"$1({strlen})"); + else colattr.DbType = Regex.Replace(colattr.DbType, charPattern, m => + replaceCounter++ == 0 ? $"{m.Groups[1].Value}({strlen})" : m.Groups[0].Value); break; case DataType.Dameng: if (strlen < 0) colattr.DbType = $"TEXT{strNotNull}"; - else colattr.DbType = Regex.Replace(colattr.DbType, charPatten, $"$1({strlen})"); + else colattr.DbType = Regex.Replace(colattr.DbType, charPattern, m => + replaceCounter++ == 0 ? $"{m.Groups[1].Value}({strlen})" : m.Groups[0].Value); break; case DataType.OdbcOracle: case DataType.OdbcDameng: - if (strlen < 0) colattr.DbType = Regex.Replace(colattr.DbType, charPatten, $"$1(4000)"); //ODBC 不支持 NCLOB - else colattr.DbType = Regex.Replace(colattr.DbType, charPatten, $"$1({strlen})"); + if (strlen < 0) colattr.DbType = Regex.Replace(colattr.DbType, charPattern, m => + replaceCounter++ == 0 ? $"{m.Groups[1].Value}(4000)" : m.Groups[0].Value); //ODBC 不支持 NCLOB + else colattr.DbType = Regex.Replace(colattr.DbType, charPattern, m => + replaceCounter++ == 0 ? $"{m.Groups[1].Value}({strlen})" : m.Groups[0].Value); break; case DataType.Sqlite: if (strlen < 0) colattr.DbType = $"TEXT{strNotNull}"; - else colattr.DbType = Regex.Replace(colattr.DbType, charPatten, $"$1({strlen})"); + else colattr.DbType = Regex.Replace(colattr.DbType, charPattern, m => + replaceCounter++ == 0 ? $"{m.Groups[1].Value}({strlen})" : m.Groups[0].Value); break; case DataType.MsAccess: - charPatten = @"(CHAR|CHAR2|CHARACTER|TEXT)\s*(\([^\)]*\))?"; + charPattern = @"(CHAR|CHAR2|CHARACTER|TEXT)\s*(\([^\)]*\))?"; if (strlen < 0) colattr.DbType = $"LONGTEXT{strNotNull}"; - else colattr.DbType = Regex.Replace(colattr.DbType, charPatten, $"$1({strlen})"); + else colattr.DbType = Regex.Replace(colattr.DbType, charPattern, m => + replaceCounter++ == 0 ? $"{m.Groups[1].Value}({strlen})" : m.Groups[0].Value); break; case DataType.Firebird: - charPatten = @"(CHAR|CHAR2|CHARACTER|TEXT)\s*(\([^\)]*\))?"; + charPattern = @"(CHAR|CHAR2|CHARACTER|TEXT)\s*(\([^\)]*\))?"; if (strlen < 0) colattr.DbType = $"BLOB SUB_TYPE 1{strNotNull}"; - else colattr.DbType = Regex.Replace(colattr.DbType, charPatten, $"$1({strlen})"); + else colattr.DbType = Regex.Replace(colattr.DbType, charPattern, m => + replaceCounter++ == 0 ? $"{m.Groups[1].Value}({strlen})" : m.Groups[0].Value); break; case DataType.GBase: if (strlen < 0) colattr.DbType = $"TEXT{strNotNull}"; - else colattr.DbType = Regex.Replace(colattr.DbType, charPatten, $"$1({strlen})"); + else colattr.DbType = Regex.Replace(colattr.DbType, charPattern, m => + replaceCounter++ == 0 ? $"{m.Groups[1].Value}({strlen})" : m.Groups[0].Value); break; } } @@ -412,7 +425,7 @@ namespace FreeSql.Internal if (colattr.MapType == typeof(byte[]) && colattr.StringLength != 0) { int strlen = colattr.StringLength; - var bytePatten = @"(VARBINARY|BINARY|BYTEA)\s*(\([^\)]*\))?"; + var bytePattern = @"(VARBINARY|BINARY|BYTEA)\s*(\([^\)]*\))?"; var strNotNull = colattr.IsNullable == false ? " NOT NULL" : ""; switch (common._orm.Ado.DataType) { @@ -421,13 +434,13 @@ namespace FreeSql.Internal case DataType.CustomMySql: if (strlen == -2) colattr.DbType = $"LONGBLOB{strNotNull}"; else if (strlen < 0) colattr.DbType = $"BLOB{strNotNull}"; - else colattr.DbType = Regex.Replace(colattr.DbType, bytePatten, $"$1({strlen})"); + else colattr.DbType = Regex.Replace(colattr.DbType, bytePattern, $"$1({strlen})"); break; case DataType.SqlServer: case DataType.OdbcSqlServer: case DataType.CustomSqlServer: - if (strlen < 0) colattr.DbType = Regex.Replace(colattr.DbType, bytePatten, $"$1(MAX)"); - else colattr.DbType = Regex.Replace(colattr.DbType, bytePatten, $"$1({strlen})"); + if (strlen < 0) colattr.DbType = Regex.Replace(colattr.DbType, bytePattern, $"$1(MAX)"); + else colattr.DbType = Regex.Replace(colattr.DbType, bytePattern, $"$1({strlen})"); break; case DataType.PostgreSQL: case DataType.OdbcPostgreSQL: @@ -453,7 +466,7 @@ namespace FreeSql.Internal break; case DataType.MsAccess: if (strlen < 0) colattr.DbType = $"BLOB{strNotNull}"; - else colattr.DbType = Regex.Replace(colattr.DbType, bytePatten, $"$1({strlen})"); + else colattr.DbType = Regex.Replace(colattr.DbType, bytePattern, $"$1({strlen})"); break; case DataType.Firebird: colattr.DbType = $"BLOB{strNotNull}";