- 修复 Column DbType 与 StringLength 多次替换问题;

This commit is contained in:
2881099 2023-12-01 10:03:38 +08:00
parent a8c72b19da
commit e69fc68f5d
2 changed files with 35 additions and 40 deletions

View File

@ -733,15 +733,6 @@
<param name="modelBuilder"></param> <param name="modelBuilder"></param>
<returns></returns> <returns></returns>
</member> </member>
<member name="M:FreeSqlDbContextExtensions.ApplyConfigurationsFromAssembly(FreeSql.ICodeFirst,System.Reflection.Assembly,System.Func{System.Type,System.Boolean})">
<summary>
根据Assembly扫描所有继承IEntityTypeConfiguration&lt;T&gt;的配置类
</summary>
<param name="codeFirst"></param>
<param name="assembly"></param>
<param name="predicate"></param>
<returns></returns>
</member>
<member name="M:FreeSqlDbContextExtensions.CreateDbContext(IFreeSql)"> <member name="M:FreeSqlDbContextExtensions.CreateDbContext(IFreeSql)">
<summary> <summary>
创建普通数据上下文档对象 创建普通数据上下文档对象
@ -800,14 +791,5 @@
<param name="that"></param> <param name="that"></param>
<returns></returns> <returns></returns>
</member> </member>
<member name="M:Microsoft.Extensions.DependencyInjection.FreeSqlRepositoryDependencyInjection.AddFreeRepository(Microsoft.Extensions.DependencyInjection.IServiceCollection,System.Action{FreeSql.FluentDataFilter},System.Reflection.Assembly[])">
<summary>
批量注入 Repository可以参考代码自行调整
</summary>
<param name="services"></param>
<param name="globalDataFilter"></param>
<param name="assemblies"></param>
<returns></returns>
</member>
</members> </members>
</doc> </doc>

View File

@ -347,22 +347,26 @@ namespace FreeSql.Internal
if (colattr.MapType.NullableTypeOrThis() == typeof(string) && colattr.StringLength != 0) if (colattr.MapType.NullableTypeOrThis() == typeof(string) && colattr.StringLength != 0)
{ {
int strlen = colattr.StringLength; 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" : ""; var strNotNull = colattr.IsNullable == false ? " NOT NULL" : "";
switch (common._orm.Ado.DataType) switch (common._orm.Ado.DataType)
{ {
case DataType.MySql: case DataType.MySql:
case DataType.OdbcMySql: case DataType.OdbcMySql:
case DataType.CustomMySql: case DataType.CustomMySql:
if (strlen == -2) colattr.DbType = $"LONGTEXT{strNotNull}"; if (strlen == -2) colattr.DbType = $"LONGTEXT{strNotNull}";
else if (strlen < 0) colattr.DbType = $"TEXT{strNotNull}"; else 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; break;
case DataType.SqlServer: case DataType.SqlServer:
case DataType.OdbcSqlServer: case DataType.OdbcSqlServer:
case DataType.CustomSqlServer: case DataType.CustomSqlServer:
if (strlen < 0) colattr.DbType = Regex.Replace(colattr.DbType, charPatten, $"$1(MAX)"); if (strlen < 0) colattr.DbType = Regex.Replace(colattr.DbType, charPattern, m =>
else colattr.DbType = Regex.Replace(colattr.DbType, charPatten, $"$1({strlen})"); 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; break;
case DataType.PostgreSQL: case DataType.PostgreSQL:
case DataType.OdbcPostgreSQL: case DataType.OdbcPostgreSQL:
@ -371,39 +375,48 @@ namespace FreeSql.Internal
case DataType.OdbcKingbaseES: case DataType.OdbcKingbaseES:
case DataType.ShenTong: case DataType.ShenTong:
if (strlen < 0) colattr.DbType = $"TEXT{strNotNull}"; 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; break;
case DataType.Oracle: case DataType.Oracle:
case DataType.CustomOracle: case DataType.CustomOracle:
if (strlen < 0) colattr.DbType = $"NCLOB{strNotNull}"; //v1.3.2+ https://github.com/dotnetcore/FreeSql/issues/259 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; break;
case DataType.Dameng: case DataType.Dameng:
if (strlen < 0) colattr.DbType = $"TEXT{strNotNull}"; 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; break;
case DataType.OdbcOracle: case DataType.OdbcOracle:
case DataType.OdbcDameng: case DataType.OdbcDameng:
if (strlen < 0) colattr.DbType = Regex.Replace(colattr.DbType, charPatten, $"$1(4000)"); //ODBC 不支持 NCLOB if (strlen < 0) colattr.DbType = Regex.Replace(colattr.DbType, charPattern, m =>
else colattr.DbType = Regex.Replace(colattr.DbType, charPatten, $"$1({strlen})"); 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; break;
case DataType.Sqlite: case DataType.Sqlite:
if (strlen < 0) colattr.DbType = $"TEXT{strNotNull}"; 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; break;
case DataType.MsAccess: case DataType.MsAccess:
charPatten = @"(CHAR|CHAR2|CHARACTER|TEXT)\s*(\([^\)]*\))?"; charPattern = @"(CHAR|CHAR2|CHARACTER|TEXT)\s*(\([^\)]*\))?";
if (strlen < 0) colattr.DbType = $"LONGTEXT{strNotNull}"; 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; break;
case DataType.Firebird: 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}"; 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; break;
case DataType.GBase: case DataType.GBase:
if (strlen < 0) colattr.DbType = $"TEXT{strNotNull}"; 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; break;
} }
} }
@ -412,7 +425,7 @@ namespace FreeSql.Internal
if (colattr.MapType == typeof(byte[]) && colattr.StringLength != 0) if (colattr.MapType == typeof(byte[]) && colattr.StringLength != 0)
{ {
int strlen = colattr.StringLength; int strlen = colattr.StringLength;
var bytePatten = @"(VARBINARY|BINARY|BYTEA)\s*(\([^\)]*\))?"; var bytePattern = @"(VARBINARY|BINARY|BYTEA)\s*(\([^\)]*\))?";
var strNotNull = colattr.IsNullable == false ? " NOT NULL" : ""; var strNotNull = colattr.IsNullable == false ? " NOT NULL" : "";
switch (common._orm.Ado.DataType) switch (common._orm.Ado.DataType)
{ {
@ -421,13 +434,13 @@ namespace FreeSql.Internal
case DataType.CustomMySql: case DataType.CustomMySql:
if (strlen == -2) colattr.DbType = $"LONGBLOB{strNotNull}"; if (strlen == -2) colattr.DbType = $"LONGBLOB{strNotNull}";
else if (strlen < 0) colattr.DbType = $"BLOB{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; break;
case DataType.SqlServer: case DataType.SqlServer:
case DataType.OdbcSqlServer: case DataType.OdbcSqlServer:
case DataType.CustomSqlServer: case DataType.CustomSqlServer:
if (strlen < 0) colattr.DbType = Regex.Replace(colattr.DbType, bytePatten, $"$1(MAX)"); if (strlen < 0) colattr.DbType = Regex.Replace(colattr.DbType, bytePattern, $"$1(MAX)");
else colattr.DbType = Regex.Replace(colattr.DbType, bytePatten, $"$1({strlen})"); else colattr.DbType = Regex.Replace(colattr.DbType, bytePattern, $"$1({strlen})");
break; break;
case DataType.PostgreSQL: case DataType.PostgreSQL:
case DataType.OdbcPostgreSQL: case DataType.OdbcPostgreSQL:
@ -453,7 +466,7 @@ namespace FreeSql.Internal
break; break;
case DataType.MsAccess: case DataType.MsAccess:
if (strlen < 0) colattr.DbType = $"BLOB{strNotNull}"; 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; break;
case DataType.Firebird: case DataType.Firebird:
colattr.DbType = $"BLOB{strNotNull}"; colattr.DbType = $"BLOB{strNotNull}";