From 73eb3c8b2180c3a35001ba6327a41dbf2a756ed1 Mon Sep 17 00:00:00 2001 From: 28810 <28810@YEXIANGQIN> Date: Tue, 23 Jun 2020 14:48:06 +0800 Subject: [PATCH] =?UTF-8?q?-=20=E5=A2=9E=E5=8A=A0=20StringLength/MaxLength?= =?UTF-8?q?=20=E5=AF=B9=20byte[]=20=E7=9A=84=E6=94=AF=E6=8C=81=EF=BC=9B?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Examples/base_entity/Program.cs | 20 +++++++++ .../MySqlConnector/MySqlCodeFirstTest.cs | 33 +++++++++++++++ .../Dameng/DamengCodeFirstTest.cs | 2 + .../FreeSql.Tests/MySql/MySqlCodeFirstTest.cs | 33 +++++++++++++++ .../Oracle/OracleCodeFirstTest.cs | 2 + .../PostgreSQL/PostgreSQLCodeFirstTest.cs | 33 +++++++++++++++ .../ShenTong/ShenTongCodeFirstTest.cs | 2 + .../SqlServer/SqlServerCodeFirstTest.cs | 33 +++++++++++++++ .../Sqlite/SqliteCodeFirstTest.cs | 33 +++++++++++++++ FreeSql/DataAnnotations/ColumnAttribute.cs | 5 ++- FreeSql/FreeSql.xml | 5 ++- FreeSql/Internal/UtilsExpressionTree.cs | 42 +++++++++++++++++++ 12 files changed, 239 insertions(+), 4 deletions(-) diff --git a/Examples/base_entity/Program.cs b/Examples/base_entity/Program.cs index b08dd7f2..9d674f29 100644 --- a/Examples/base_entity/Program.cs +++ b/Examples/base_entity/Program.cs @@ -149,6 +149,26 @@ namespace base_entity var repo = BaseEntity.Orm.Select().Limit(10).ToList(); + + //void ConfigEntityProperty(object sender, FreeSql.Aop.ConfigEntityPropertyEventArgs e) + //{ + // if (e.Property.PropertyType == typeof(byte[])) + // { + // var orm = sender as IFreeSql; + // switch (orm.Ado.DataType) + // { + // case DataType.SqlServer: + // e.ModifyResult.DbType = "image"; + // break; + // case DataType.MySql: + // e.ModifyResult.DbType = "longblob"; + // break; + // } + // } + //} + //fsql.Aop.ConfigEntityProperty += ConfigEntityProperty; + + Task.Run(async () => { using (var uow = BaseEntity.Orm.CreateUnitOfWork()) diff --git a/FreeSql.Tests/FreeSql.Tests.Provider.MySqlConnector/MySqlConnector/MySqlCodeFirstTest.cs b/FreeSql.Tests/FreeSql.Tests.Provider.MySqlConnector/MySqlConnector/MySqlCodeFirstTest.cs index 9947a09a..6d04609c 100644 --- a/FreeSql.Tests/FreeSql.Tests.Provider.MySqlConnector/MySqlConnector/MySqlCodeFirstTest.cs +++ b/FreeSql.Tests/FreeSql.Tests.Provider.MySqlConnector/MySqlConnector/MySqlCodeFirstTest.cs @@ -2,6 +2,7 @@ using FreeSql.DataAnnotations; using Newtonsoft.Json; using System; using System.Collections.Generic; +using System.ComponentModel.DataAnnotations; using System.Linq; using System.Text; using Xunit; @@ -98,6 +99,38 @@ namespace FreeSql.Tests.MySqlConnector public string Data { get; set; } } + [Fact] + public void Blob() + { + var str1 = string.Join(",", Enumerable.Range(0, 10000).Select(a => "我是中国人")); + var data1 = Encoding.UTF8.GetBytes(str1); + + var item1 = new TS_BLB01 { Data = data1 }; + Assert.Equal(1, g.mysql.Insert(item1).ExecuteAffrows()); + + var item2 = g.mysql.Select().Where(a => a.Id == item1.Id).First(); + Assert.Equal(item1.Data.Length, item2.Data.Length); + + var str2 = Encoding.UTF8.GetString(item2.Data); + Assert.Equal(str1, str2); + + //NoneParameter + item1 = new TS_BLB01 { Data = data1 }; + Assert.Equal(1, g.mysql.Insert().NoneParameter().AppendData(item1).ExecuteAffrows()); + + item2 = g.mysql.Select().Where(a => a.Id == item1.Id).First(); + Assert.Equal(item1.Data.Length, item2.Data.Length); + + str2 = Encoding.UTF8.GetString(item2.Data); + Assert.Equal(str1, str2); + } + class TS_BLB01 + { + public Guid Id { get; set; } + [MaxLength(-2)] + public byte[] Data { get; set; } + } + [Fact] public void StringLength() { diff --git a/FreeSql.Tests/FreeSql.Tests/Dameng/DamengCodeFirstTest.cs b/FreeSql.Tests/FreeSql.Tests/Dameng/DamengCodeFirstTest.cs index bb456652..bc5688c8 100644 --- a/FreeSql.Tests/FreeSql.Tests/Dameng/DamengCodeFirstTest.cs +++ b/FreeSql.Tests/FreeSql.Tests/Dameng/DamengCodeFirstTest.cs @@ -2,6 +2,7 @@ using FreeSql.DataAnnotations; using Newtonsoft.Json; using System; using System.Collections.Generic; +using System.ComponentModel.DataAnnotations; using System.Linq; using System.Text; using Xunit; @@ -76,6 +77,7 @@ namespace FreeSql.Tests.Dameng class TS_BLB01 { public Guid Id { get; set; } + [MaxLength(-1)] public byte[] Data { get; set; } } [Fact] diff --git a/FreeSql.Tests/FreeSql.Tests/MySql/MySqlCodeFirstTest.cs b/FreeSql.Tests/FreeSql.Tests/MySql/MySqlCodeFirstTest.cs index 809cc6a3..4b927196 100644 --- a/FreeSql.Tests/FreeSql.Tests/MySql/MySqlCodeFirstTest.cs +++ b/FreeSql.Tests/FreeSql.Tests/MySql/MySqlCodeFirstTest.cs @@ -2,6 +2,7 @@ using FreeSql.DataAnnotations; using Newtonsoft.Json; using System; using System.Collections.Generic; +using System.ComponentModel.DataAnnotations; using System.Linq; using System.Text; using Xunit; @@ -98,6 +99,38 @@ namespace FreeSql.Tests.MySql public string Data { get; set; } } + [Fact] + public void Blob() + { + var str1 = string.Join(",", Enumerable.Range(0, 10000).Select(a => "我是中国人")); + var data1 = Encoding.UTF8.GetBytes(str1); + + var item1 = new TS_BLB01 { Data = data1 }; + Assert.Equal(1, g.mysql.Insert(item1).ExecuteAffrows()); + + var item2 = g.mysql.Select().Where(a => a.Id == item1.Id).First(); + Assert.Equal(item1.Data.Length, item2.Data.Length); + + var str2 = Encoding.UTF8.GetString(item2.Data); + Assert.Equal(str1, str2); + + //NoneParameter + item1 = new TS_BLB01 { Data = data1 }; + Assert.Equal(1, g.mysql.Insert().NoneParameter().AppendData(item1).ExecuteAffrows()); + + item2 = g.mysql.Select().Where(a => a.Id == item1.Id).First(); + Assert.Equal(item1.Data.Length, item2.Data.Length); + + str2 = Encoding.UTF8.GetString(item2.Data); + Assert.Equal(str1, str2); + } + class TS_BLB01 + { + public Guid Id { get; set; } + [MaxLength(-2)] + public byte[] Data { get; set; } + } + [Fact] public void StringLength() { diff --git a/FreeSql.Tests/FreeSql.Tests/Oracle/OracleCodeFirstTest.cs b/FreeSql.Tests/FreeSql.Tests/Oracle/OracleCodeFirstTest.cs index 8080c0fa..a751c4ea 100644 --- a/FreeSql.Tests/FreeSql.Tests/Oracle/OracleCodeFirstTest.cs +++ b/FreeSql.Tests/FreeSql.Tests/Oracle/OracleCodeFirstTest.cs @@ -3,6 +3,7 @@ using Newtonsoft.Json; using Oracle.ManagedDataAccess.Client; using System; using System.Collections.Generic; +using System.ComponentModel.DataAnnotations; using System.Linq; using System.Text; using Xunit; @@ -101,6 +102,7 @@ namespace FreeSql.Tests.Oracle class TS_BLB01 { public Guid Id { get; set; } + [MaxLength(-1)] public byte[] Data { get; set; } } [Fact] diff --git a/FreeSql.Tests/FreeSql.Tests/PostgreSQL/PostgreSQLCodeFirstTest.cs b/FreeSql.Tests/FreeSql.Tests/PostgreSQL/PostgreSQLCodeFirstTest.cs index ca7ab03e..169a2707 100644 --- a/FreeSql.Tests/FreeSql.Tests/PostgreSQL/PostgreSQLCodeFirstTest.cs +++ b/FreeSql.Tests/FreeSql.Tests/PostgreSQL/PostgreSQLCodeFirstTest.cs @@ -7,6 +7,7 @@ using NpgsqlTypes; using System; using System.Collections; using System.Collections.Generic; +using System.ComponentModel.DataAnnotations; using System.Linq; using System.Net; using System.Net.NetworkInformation; @@ -17,6 +18,38 @@ namespace FreeSql.Tests.PostgreSQL { public class PostgreSQLCodeFirstTest { + [Fact] + public void Blob() + { + var str1 = string.Join(",", Enumerable.Range(0, 10000).Select(a => "我是中国人")); + var data1 = Encoding.UTF8.GetBytes(str1); + + var item1 = new TS_BLB01 { Data = data1 }; + Assert.Equal(1, g.pgsql.Insert(item1).ExecuteAffrows()); + + var item2 = g.pgsql.Select().Where(a => a.Id == item1.Id).First(); + Assert.Equal(item1.Data.Length, item2.Data.Length); + + var str2 = Encoding.UTF8.GetString(item2.Data); + Assert.Equal(str1, str2); + + //NoneParameter + item1 = new TS_BLB01 { Data = data1 }; + Assert.Equal(1, g.pgsql.Insert().NoneParameter().AppendData(item1).ExecuteAffrows()); + + item2 = g.pgsql.Select().Where(a => a.Id == item1.Id).First(); + Assert.Equal(item1.Data.Length, item2.Data.Length); + + str2 = Encoding.UTF8.GetString(item2.Data); + Assert.Equal(str1, str2); + } + class TS_BLB01 + { + public Guid Id { get; set; } + [MaxLength(-1)] + public byte[] Data { get; set; } + } + [Fact] public void StringLength() { diff --git a/FreeSql.Tests/FreeSql.Tests/ShenTong/ShenTongCodeFirstTest.cs b/FreeSql.Tests/FreeSql.Tests/ShenTong/ShenTongCodeFirstTest.cs index 23475c9f..4f4dbba4 100644 --- a/FreeSql.Tests/FreeSql.Tests/ShenTong/ShenTongCodeFirstTest.cs +++ b/FreeSql.Tests/FreeSql.Tests/ShenTong/ShenTongCodeFirstTest.cs @@ -2,6 +2,7 @@ using FreeSql.DataAnnotations; using System; using System.Collections; using System.Collections.Generic; +using System.ComponentModel.DataAnnotations; using System.Linq; using System.Net; using System.Net.NetworkInformation; @@ -12,6 +13,7 @@ namespace FreeSql.Tests.ShenTong { public class ShenTongCodeFirstTest { + [Fact] public void StringLength() { diff --git a/FreeSql.Tests/FreeSql.Tests/SqlServer/SqlServerCodeFirstTest.cs b/FreeSql.Tests/FreeSql.Tests/SqlServer/SqlServerCodeFirstTest.cs index a835f5e5..e9334de5 100644 --- a/FreeSql.Tests/FreeSql.Tests/SqlServer/SqlServerCodeFirstTest.cs +++ b/FreeSql.Tests/FreeSql.Tests/SqlServer/SqlServerCodeFirstTest.cs @@ -3,6 +3,7 @@ using FreeSql.Tests.DataContext.SqlServer; using Newtonsoft.Json; using System; using System.Collections.Generic; +using System.ComponentModel.DataAnnotations; using System.Linq; using System.Text; using Xunit; @@ -11,6 +12,38 @@ namespace FreeSql.Tests.SqlServer { public class SqlServerCodeFirstTest { + [Fact] + public void Blob() + { + var str1 = string.Join(",", Enumerable.Range(0, 10000).Select(a => "我是中国人")); + var data1 = Encoding.UTF8.GetBytes(str1); + + var item1 = new TS_BLB01 { Data = data1 }; + Assert.Equal(1, g.sqlserver.Insert(item1).ExecuteAffrows()); + + var item2 = g.sqlserver.Select().Where(a => a.Id == item1.Id).First(); + Assert.Equal(item1.Data.Length, item2.Data.Length); + + var str2 = Encoding.UTF8.GetString(item2.Data); + Assert.Equal(str1, str2); + + //NoneParameter + item1 = new TS_BLB01 { Data = data1 }; + Assert.Equal(1, g.sqlserver.Insert().NoneParameter().AppendData(item1).ExecuteAffrows()); + + item2 = g.sqlserver.Select().Where(a => a.Id == item1.Id).First(); + Assert.Equal(item1.Data.Length, item2.Data.Length); + + str2 = Encoding.UTF8.GetString(item2.Data); + Assert.Equal(str1, str2); + } + class TS_BLB01 + { + public Guid Id { get; set; } + [MaxLength(-1)] + public byte[] Data { get; set; } + } + [Fact] public void StringLength() { diff --git a/FreeSql.Tests/FreeSql.Tests/Sqlite/SqliteCodeFirstTest.cs b/FreeSql.Tests/FreeSql.Tests/Sqlite/SqliteCodeFirstTest.cs index e8084e14..98ecf805 100644 --- a/FreeSql.Tests/FreeSql.Tests/Sqlite/SqliteCodeFirstTest.cs +++ b/FreeSql.Tests/FreeSql.Tests/Sqlite/SqliteCodeFirstTest.cs @@ -2,6 +2,7 @@ using FreeSql.DataAnnotations; using Newtonsoft.Json; using System; using System.Collections.Generic; +using System.ComponentModel.DataAnnotations; using System.Linq; using System.Text; using Xunit; @@ -10,6 +11,38 @@ namespace FreeSql.Tests.Sqlite { public class SqliteCodeFirstTest { + [Fact] + public void Blob() + { + var str1 = string.Join(",", Enumerable.Range(0, 10000).Select(a => "我是中国人")); + var data1 = Encoding.UTF8.GetBytes(str1); + + var item1 = new TS_BLB01 { Data = data1 }; + Assert.Equal(1, g.sqlite.Insert(item1).ExecuteAffrows()); + + var item2 = g.sqlite.Select().Where(a => a.Id == item1.Id).First(); + Assert.Equal(item1.Data.Length, item2.Data.Length); + + var str2 = Encoding.UTF8.GetString(item2.Data); + Assert.Equal(str1, str2); + + //NoneParameter + item1 = new TS_BLB01 { Data = data1 }; + Assert.Equal(1, g.sqlite.Insert().NoneParameter().AppendData(item1).ExecuteAffrows()); + + item2 = g.sqlite.Select().Where(a => a.Id == item1.Id).First(); + Assert.Equal(item1.Data.Length, item2.Data.Length); + + str2 = Encoding.UTF8.GetString(item2.Data); + Assert.Equal(str1, str2); + } + class TS_BLB01 + { + public Guid Id { get; set; } + [MaxLength(-1)] + public byte[] Data { get; set; } + } + [Fact] public void StringLength() { diff --git a/FreeSql/DataAnnotations/ColumnAttribute.cs b/FreeSql/DataAnnotations/ColumnAttribute.cs index ae45c75c..b6b11569 100644 --- a/FreeSql/DataAnnotations/ColumnAttribute.cs +++ b/FreeSql/DataAnnotations/ColumnAttribute.cs @@ -79,7 +79,7 @@ namespace FreeSql.DataAnnotations internal int? _StringLength; /// - /// 璁剧疆闀垮害锛岄拡瀵 string 绫诲瀷閬垮厤 DbType 鐨勭箒鐞愯缃 + /// 璁剧疆闀垮害锛岄拡瀵 string/byte[] 绫诲瀷閬垮厤 DbType 鐨勭箒鐞愯缃 /// 鎻愮ず锛氫篃鍙互浣跨敤 [MaxLength(100)] /// --- /// StringLength = 100 鏃讹紝瀵瑰簲 DbType锛 @@ -90,11 +90,12 @@ namespace FreeSql.DataAnnotations /// Sqlite -> nvarchar(100) /// --- /// StringLength < 0 鏃讹紝瀵瑰簲 DbType锛 - /// MySql -> text (StringLength = -2 鏃讹紝瀵瑰簲 DbType longtext) + /// MySql -> text (StringLength = -2 鏃讹紝瀵瑰簲 longtext) /// SqlServer -> nvarchar(max) /// PostgreSQL -> text /// Oracle -> nclob /// Sqlite -> text + /// v1.6.0+ byte[] 鏀寔璁剧疆 StringLength /// public int StringLength { get => _StringLength ?? 0; set => _StringLength = value; } diff --git a/FreeSql/FreeSql.xml b/FreeSql/FreeSql.xml index 7f3b7221..b749f144 100644 --- a/FreeSql/FreeSql.xml +++ b/FreeSql/FreeSql.xml @@ -80,7 +80,7 @@ - 璁剧疆闀垮害锛岄拡瀵 string 绫诲瀷閬垮厤 DbType 鐨勭箒鐞愯缃 + 璁剧疆闀垮害锛岄拡瀵 string/byte[] 绫诲瀷閬垮厤 DbType 鐨勭箒鐞愯缃 鎻愮ず锛氫篃鍙互浣跨敤 [MaxLength(100)] --- StringLength = 100 鏃讹紝瀵瑰簲 DbType锛 @@ -91,11 +91,12 @@ Sqlite -> nvarchar(100) --- StringLength < 0 鏃讹紝瀵瑰簲 DbType锛 - MySql -> text (StringLength = -2 鏃讹紝瀵瑰簲 DbType longtext) + MySql -> text (StringLength = -2 鏃讹紝瀵瑰簲 longtext) SqlServer -> nvarchar(max) PostgreSQL -> text Oracle -> nclob Sqlite -> text + v1.6.0+ byte[] 鏀寔璁剧疆 StringLength diff --git a/FreeSql/Internal/UtilsExpressionTree.cs b/FreeSql/Internal/UtilsExpressionTree.cs index b45f3d28..272e09e7 100644 --- a/FreeSql/Internal/UtilsExpressionTree.cs +++ b/FreeSql/Internal/UtilsExpressionTree.cs @@ -272,6 +272,48 @@ namespace FreeSql.Internal break; } } + if (colattr.MapType == typeof(byte[]) && colattr.StringLength != 0) + { + int strlen = colattr.StringLength; + var charPatten = @"(VARBINARY|BINARY|BYTEA)\s*(\([^\)]*\))?"; + switch (common._orm.Ado.DataType) + { + case DataType.MySql: + case DataType.OdbcMySql: + if (strlen == -2) colattr.DbType = "LONGBLOB"; + else if (strlen < 0) colattr.DbType = "BLOB"; + 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: + case DataType.OdbcKingbaseES: + case DataType.ShenTong: //椹卞姩寮曞彂鐨勫紓甯:鈥淪ystem.Data.OscarClient.OscarException鈥(浣嶄簬 System.Data.OscarClient.dll 涓) + colattr.DbType = "BYTEA"; //鍙橀暱浜岃繘鍒朵覆 + break; + case DataType.Oracle: + colattr.DbType = "BLOB"; + break; + case DataType.Dameng: + colattr.DbType = "BLOB"; + break; + case DataType.OdbcOracle: + case DataType.OdbcDameng: + colattr.DbType = "BLOB"; + break; + case DataType.Sqlite: + colattr.DbType = "BLOB"; + break; + case DataType.MsAccess: + if (strlen < 0) colattr.DbType = "BLOB"; + 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} 閲嶅瀛樺湪锛岃妫鏌ワ紙娉ㄦ剰锛氫笉鍖哄垎澶у皬鍐欙級");