- 增加 StringLength/MaxLength 对 byte[] 的支持;

This commit is contained in:
28810 2020-06-23 14:48:06 +08:00
parent 4ddf4c01a6
commit 73eb3c8b21
12 changed files with 239 additions and 4 deletions

View File

@ -149,6 +149,26 @@ namespace base_entity
var repo = BaseEntity.Orm.Select<TestConfig>().Limit(10).ToList(); var repo = BaseEntity.Orm.Select<TestConfig>().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 () => Task.Run(async () =>
{ {
using (var uow = BaseEntity.Orm.CreateUnitOfWork()) using (var uow = BaseEntity.Orm.CreateUnitOfWork())

View File

@ -2,6 +2,7 @@ using FreeSql.DataAnnotations;
using Newtonsoft.Json; using Newtonsoft.Json;
using System; using System;
using System.Collections.Generic; using System.Collections.Generic;
using System.ComponentModel.DataAnnotations;
using System.Linq; using System.Linq;
using System.Text; using System.Text;
using Xunit; using Xunit;
@ -98,6 +99,38 @@ namespace FreeSql.Tests.MySqlConnector
public string Data { get; set; } 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<TS_BLB01>().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<TS_BLB01>().NoneParameter().AppendData(item1).ExecuteAffrows());
item2 = g.mysql.Select<TS_BLB01>().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] [Fact]
public void StringLength() public void StringLength()
{ {

View File

@ -2,6 +2,7 @@ using FreeSql.DataAnnotations;
using Newtonsoft.Json; using Newtonsoft.Json;
using System; using System;
using System.Collections.Generic; using System.Collections.Generic;
using System.ComponentModel.DataAnnotations;
using System.Linq; using System.Linq;
using System.Text; using System.Text;
using Xunit; using Xunit;
@ -76,6 +77,7 @@ namespace FreeSql.Tests.Dameng
class TS_BLB01 class TS_BLB01
{ {
public Guid Id { get; set; } public Guid Id { get; set; }
[MaxLength(-1)]
public byte[] Data { get; set; } public byte[] Data { get; set; }
} }
[Fact] [Fact]

View File

@ -2,6 +2,7 @@ using FreeSql.DataAnnotations;
using Newtonsoft.Json; using Newtonsoft.Json;
using System; using System;
using System.Collections.Generic; using System.Collections.Generic;
using System.ComponentModel.DataAnnotations;
using System.Linq; using System.Linq;
using System.Text; using System.Text;
using Xunit; using Xunit;
@ -98,6 +99,38 @@ namespace FreeSql.Tests.MySql
public string Data { get; set; } 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<TS_BLB01>().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<TS_BLB01>().NoneParameter().AppendData(item1).ExecuteAffrows());
item2 = g.mysql.Select<TS_BLB01>().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] [Fact]
public void StringLength() public void StringLength()
{ {

View File

@ -3,6 +3,7 @@ using Newtonsoft.Json;
using Oracle.ManagedDataAccess.Client; using Oracle.ManagedDataAccess.Client;
using System; using System;
using System.Collections.Generic; using System.Collections.Generic;
using System.ComponentModel.DataAnnotations;
using System.Linq; using System.Linq;
using System.Text; using System.Text;
using Xunit; using Xunit;
@ -101,6 +102,7 @@ namespace FreeSql.Tests.Oracle
class TS_BLB01 class TS_BLB01
{ {
public Guid Id { get; set; } public Guid Id { get; set; }
[MaxLength(-1)]
public byte[] Data { get; set; } public byte[] Data { get; set; }
} }
[Fact] [Fact]

View File

@ -7,6 +7,7 @@ using NpgsqlTypes;
using System; using System;
using System.Collections; using System.Collections;
using System.Collections.Generic; using System.Collections.Generic;
using System.ComponentModel.DataAnnotations;
using System.Linq; using System.Linq;
using System.Net; using System.Net;
using System.Net.NetworkInformation; using System.Net.NetworkInformation;
@ -17,6 +18,38 @@ namespace FreeSql.Tests.PostgreSQL
{ {
public class PostgreSQLCodeFirstTest 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<TS_BLB01>().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<TS_BLB01>().NoneParameter().AppendData(item1).ExecuteAffrows());
item2 = g.pgsql.Select<TS_BLB01>().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] [Fact]
public void StringLength() public void StringLength()
{ {

View File

@ -2,6 +2,7 @@ using FreeSql.DataAnnotations;
using System; using System;
using System.Collections; using System.Collections;
using System.Collections.Generic; using System.Collections.Generic;
using System.ComponentModel.DataAnnotations;
using System.Linq; using System.Linq;
using System.Net; using System.Net;
using System.Net.NetworkInformation; using System.Net.NetworkInformation;
@ -12,6 +13,7 @@ namespace FreeSql.Tests.ShenTong
{ {
public class ShenTongCodeFirstTest public class ShenTongCodeFirstTest
{ {
[Fact] [Fact]
public void StringLength() public void StringLength()
{ {

View File

@ -3,6 +3,7 @@ using FreeSql.Tests.DataContext.SqlServer;
using Newtonsoft.Json; using Newtonsoft.Json;
using System; using System;
using System.Collections.Generic; using System.Collections.Generic;
using System.ComponentModel.DataAnnotations;
using System.Linq; using System.Linq;
using System.Text; using System.Text;
using Xunit; using Xunit;
@ -11,6 +12,38 @@ namespace FreeSql.Tests.SqlServer
{ {
public class SqlServerCodeFirstTest 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<TS_BLB01>().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<TS_BLB01>().NoneParameter().AppendData(item1).ExecuteAffrows());
item2 = g.sqlserver.Select<TS_BLB01>().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] [Fact]
public void StringLength() public void StringLength()
{ {

View File

@ -2,6 +2,7 @@ using FreeSql.DataAnnotations;
using Newtonsoft.Json; using Newtonsoft.Json;
using System; using System;
using System.Collections.Generic; using System.Collections.Generic;
using System.ComponentModel.DataAnnotations;
using System.Linq; using System.Linq;
using System.Text; using System.Text;
using Xunit; using Xunit;
@ -10,6 +11,38 @@ namespace FreeSql.Tests.Sqlite
{ {
public class SqliteCodeFirstTest 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<TS_BLB01>().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<TS_BLB01>().NoneParameter().AppendData(item1).ExecuteAffrows());
item2 = g.sqlite.Select<TS_BLB01>().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] [Fact]
public void StringLength() public void StringLength()
{ {

View File

@ -79,7 +79,7 @@ namespace FreeSql.DataAnnotations
internal int? _StringLength; internal int? _StringLength;
/// <summary> /// <summary>
/// 设置长度,针对 string 类型避免 DbType 的繁琐设置<para></para> /// 设置长度,针对 string/byte[] 类型避免 DbType 的繁琐设置<para></para>
/// 提示:也可以使用 [MaxLength(100)]<para></para> /// 提示:也可以使用 [MaxLength(100)]<para></para>
/// ---<para></para> /// ---<para></para>
/// StringLength = 100 时,对应 DbType<para></para> /// StringLength = 100 时,对应 DbType<para></para>
@ -90,11 +90,12 @@ namespace FreeSql.DataAnnotations
/// Sqlite -> nvarchar(100)<para></para> /// Sqlite -> nvarchar(100)<para></para>
/// ---<para></para> /// ---<para></para>
/// StringLength &lt; 0 时,对应 DbType<para></para> /// StringLength &lt; 0 时,对应 DbType<para></para>
/// MySql -> text (StringLength = -2 时,对应 DbType longtext)<para></para> /// MySql -> text (StringLength = -2 时,对应 longtext)<para></para>
/// SqlServer -> nvarchar(max)<para></para> /// SqlServer -> nvarchar(max)<para></para>
/// PostgreSQL -> text<para></para> /// PostgreSQL -> text<para></para>
/// Oracle -> nclob<para></para> /// Oracle -> nclob<para></para>
/// Sqlite -> text<para></para> /// Sqlite -> text<para></para>
/// v1.6.0+ byte[] 支持设置 StringLength
/// </summary> /// </summary>
public int StringLength { get => _StringLength ?? 0; set => _StringLength = value; } public int StringLength { get => _StringLength ?? 0; set => _StringLength = value; }

View File

@ -80,7 +80,7 @@
</member> </member>
<member name="P:FreeSql.DataAnnotations.ColumnAttribute.StringLength"> <member name="P:FreeSql.DataAnnotations.ColumnAttribute.StringLength">
<summary> <summary>
设置长度,针对 string 类型避免 DbType 的繁琐设置<para></para> 设置长度,针对 string/byte[] 类型避免 DbType 的繁琐设置<para></para>
提示:也可以使用 [MaxLength(100)]<para></para> 提示:也可以使用 [MaxLength(100)]<para></para>
---<para></para> ---<para></para>
StringLength = 100 时,对应 DbType<para></para> StringLength = 100 时,对应 DbType<para></para>
@ -91,11 +91,12 @@
Sqlite -> nvarchar(100)<para></para> Sqlite -> nvarchar(100)<para></para>
---<para></para> ---<para></para>
StringLength &lt; 0 时,对应 DbType<para></para> StringLength &lt; 0 时,对应 DbType<para></para>
MySql -> text (StringLength = -2 时,对应 DbType longtext)<para></para> MySql -> text (StringLength = -2 时,对应 longtext)<para></para>
SqlServer -> nvarchar(max)<para></para> SqlServer -> nvarchar(max)<para></para>
PostgreSQL -> text<para></para> PostgreSQL -> text<para></para>
Oracle -> nclob<para></para> Oracle -> nclob<para></para>
Sqlite -> text<para></para> Sqlite -> text<para></para>
v1.6.0+ byte[] 支持设置 StringLength
</summary> </summary>
</member> </member>
<member name="P:FreeSql.DataAnnotations.ColumnAttribute.InsertValueSql"> <member name="P:FreeSql.DataAnnotations.ColumnAttribute.InsertValueSql">

View File

@ -272,6 +272,48 @@ namespace FreeSql.Internal
break; 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: //驱动引发的异常:“System.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.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} 重复存在,请检查(注意:不区分大小写)");