From b9948f45081682a020e68a8eef62328484fa46f6 Mon Sep 17 00:00:00 2001 From: 28810 <28810@YEXIANGQIN> Date: Sat, 6 Jun 2020 19:02:41 +0800 Subject: [PATCH] =?UTF-8?q?-=20=E4=BC=98=E5=8C=96=20MySql=20StringLength/M?= =?UTF-8?q?axLength=20-2=20=E4=BA=A7=E7=94=9F=20LongText=20=E6=98=A0?= =?UTF-8?q?=E5=B0=84=EF=BC=9B?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- FreeSql.DbContext/FreeSql.DbContext.xml | 16 ++++ .../MySqlConnector/MySqlCodeFirstTest.cs | 88 ++++++++++++++++++ .../Dameng/Curd/DamengInsertTest.cs | 2 +- .../Dameng/Curd/DamengUpdateTest.cs | 2 +- .../Dameng/DamengCodeFirstTest.cs | 73 ++++++++++++++- .../Dameng/MapType/BoolNullableTest.cs | 28 +----- .../FreeSql.Tests/Dameng/MapType/EnumTest.cs | 32 +------ .../Dameng/MapType/ToStringTest.cs | 92 ++----------------- .../FreeSql.Tests/MySql/MySqlCodeFirstTest.cs | 88 ++++++++++++++++++ FreeSql/DataAnnotations/ColumnAttribute.cs | 6 +- FreeSql/FreeSql.xml | 6 +- .../SelectProvider/Select0Provider.cs | 4 +- FreeSql/Internal/UtilsExpressionTree.cs | 9 +- .../DamengCodeFirst.cs | 18 +++- .../Dameng/OdbcDamengCodeFirst.cs | 8 +- .../Oracle/OdbcOracleCodeFirst.cs | 2 +- .../OracleCodeFirst.cs | 2 +- 17 files changed, 311 insertions(+), 165 deletions(-) diff --git a/FreeSql.DbContext/FreeSql.DbContext.xml b/FreeSql.DbContext/FreeSql.DbContext.xml index 132d875e..4854f49c 100644 --- a/FreeSql.DbContext/FreeSql.DbContext.xml +++ b/FreeSql.DbContext/FreeSql.DbContext.xml @@ -125,6 +125,13 @@ 清空状态数据 + + + 根据 lambda 条件删除数据 + + + + 添加 @@ -479,5 +486,14 @@ + + + 批量注入 Repository,可以参考代码自行调整 + + + + + + diff --git a/FreeSql.Tests/FreeSql.Tests.Provider.MySqlConnector/MySqlConnector/MySqlCodeFirstTest.cs b/FreeSql.Tests/FreeSql.Tests.Provider.MySqlConnector/MySqlConnector/MySqlCodeFirstTest.cs index fed6cd4f..9947a09a 100644 --- a/FreeSql.Tests/FreeSql.Tests.Provider.MySqlConnector/MySqlConnector/MySqlCodeFirstTest.cs +++ b/FreeSql.Tests/FreeSql.Tests.Provider.MySqlConnector/MySqlConnector/MySqlCodeFirstTest.cs @@ -10,6 +10,94 @@ namespace FreeSql.Tests.MySqlConnector { public class MySqlCodeFirstTest { + [Fact] + public void Text_StringLength_1() + { + var str1 = string.Join(",", Enumerable.Range(0, 1000).Select(a => "й")); + + var item1 = new TS_TEXT02 { Data = str1 }; + Assert.Equal(1, g.mysql.Insert(item1).ExecuteAffrows()); + + var item2 = g.mysql.Select().Where(a => a.Id == item1.Id).First(); + Assert.Equal(str1, item2.Data); + + //NoneParameter + item1 = new TS_TEXT02 { Data = str1 }; + Assert.Equal(1, g.mysql.Insert(item1).NoneParameter().ExecuteAffrows()); + } + class TS_TEXT02 + { + public Guid Id { get; set; } + [Column(StringLength = -1)] + public string Data { get; set; } + } + + [Fact] + public void Text() + { + var str1 = string.Join(",", Enumerable.Range(0, 1000).Select(a => "й")); + + var item1 = new TS_TEXT01 { Data = str1 }; + Assert.Equal(1, g.mysql.Insert(item1).ExecuteAffrows()); + + var item2 = g.mysql.Select().Where(a => a.Id == item1.Id).First(); + Assert.Equal(str1, item2.Data); + + //NoneParameter + item1 = new TS_TEXT01 { Data = str1 }; + Assert.Equal(1, g.mysql.Insert(item1).NoneParameter().ExecuteAffrows()); + } + class TS_TEXT01 + { + public Guid Id { get; set; } + [Column(DbType = "text")] + public string Data { get; set; } + } + + [Fact] + public void Text_StringLength_2() + { + var str1 = string.Join(",", Enumerable.Range(0, 10000).Select(a => "й")); + + var item1 = new TS_TEXT04 { Data = str1 }; + Assert.Equal(1, g.mysql.Insert(item1).ExecuteAffrows()); + + var item2 = g.mysql.Select().Where(a => a.Id == item1.Id).First(); + Assert.Equal(str1, item2.Data); + + //NoneParameter + item1 = new TS_TEXT04 { Data = str1 }; + Assert.Equal(1, g.mysql.Insert(item1).NoneParameter().ExecuteAffrows()); + } + class TS_TEXT04 + { + public Guid Id { get; set; } + [Column(StringLength = -2)] + public string Data { get; set; } + } + + [Fact] + public void LongText() + { + var str1 = string.Join(",", Enumerable.Range(0, 10000).Select(a => "й")); + + var item1 = new TS_TEXT03 { Data = str1 }; + Assert.Equal(1, g.mysql.Insert(item1).ExecuteAffrows()); + + var item2 = g.mysql.Select().Where(a => a.Id == item1.Id).First(); + Assert.Equal(str1, item2.Data); + + //NoneParameter + item1 = new TS_TEXT03 { Data = str1 }; + Assert.Equal(1, g.mysql.Insert(item1).NoneParameter().ExecuteAffrows()); + } + class TS_TEXT03 + { + public Guid Id { get; set; } + [Column(DbType = "longtext")] + public string Data { get; set; } + } + [Fact] public void StringLength() { diff --git a/FreeSql.Tests/FreeSql.Tests/Dameng/Curd/DamengInsertTest.cs b/FreeSql.Tests/FreeSql.Tests/Dameng/Curd/DamengInsertTest.cs index 4bb00a07..988f0685 100644 --- a/FreeSql.Tests/FreeSql.Tests/Dameng/Curd/DamengInsertTest.cs +++ b/FreeSql.Tests/FreeSql.Tests/Dameng/Curd/DamengInsertTest.cs @@ -9,7 +9,7 @@ namespace FreeSql.Tests.Dameng public class DamengInsertTest { - IInsert insert => g.dameng.Insert(); //�������� + IInsert insert => g.dameng.Insert().NoneParameter(); [Table(Name = "tb_topic_insert")] class Topic diff --git a/FreeSql.Tests/FreeSql.Tests/Dameng/Curd/DamengUpdateTest.cs b/FreeSql.Tests/FreeSql.Tests/Dameng/Curd/DamengUpdateTest.cs index 06c53408..995d5c31 100644 --- a/FreeSql.Tests/FreeSql.Tests/Dameng/Curd/DamengUpdateTest.cs +++ b/FreeSql.Tests/FreeSql.Tests/Dameng/Curd/DamengUpdateTest.cs @@ -7,7 +7,7 @@ namespace FreeSql.Tests.Dameng { public class DamengUpdateTest { - IUpdate update => g.dameng.Update(); + IUpdate update => g.dameng.Update().NoneParameter(); [Table(Name = "tb_topic")] class Topic diff --git a/FreeSql.Tests/FreeSql.Tests/Dameng/DamengCodeFirstTest.cs b/FreeSql.Tests/FreeSql.Tests/Dameng/DamengCodeFirstTest.cs index e8b064db..df3ff443 100644 --- a/FreeSql.Tests/FreeSql.Tests/Dameng/DamengCodeFirstTest.cs +++ b/FreeSql.Tests/FreeSql.Tests/Dameng/DamengCodeFirstTest.cs @@ -10,6 +10,74 @@ namespace FreeSql.Tests.Dameng { public class DamengCodeFirstTest { + [Fact] + public void Text_StringLength_1() + { + var str1 = string.Join(",", Enumerable.Range(0, 10000).Select(a => "й")); + + var item1 = new TS_TEXT02 { Data = str1 }; + Assert.Equal(1, g.dameng.Insert(item1).ExecuteAffrows()); + + var item2 = g.dameng.Select().Where(a => a.Id == item1.Id).First(); + Assert.Equal(str1, item2.Data); + + //NoneParameter + item1 = new TS_TEXT02 { Data = str1 }; + Assert.Equal(1, g.dameng.Insert(item1).NoneParameter().ExecuteAffrows()); + } + class TS_TEXT02 + { + public Guid Id { get; set; } + [Column(StringLength = -1)] + public string Data { get; set; } + } + + [Fact] + public void Text() + { + var str1 = string.Join(",", Enumerable.Range(0, 10000).Select(a => "й")); + + var item1 = new TS_TEXT01 { Data = str1 }; + Assert.Equal(1, g.dameng.Insert(item1).ExecuteAffrows()); + + var item2 = g.dameng.Select().Where(a => a.Id == item1.Id).First(); + Assert.Equal(str1, item2.Data); + + //NoneParameter + item1 = new TS_TEXT01 { Data = str1 }; + Assert.Equal(1, g.dameng.Insert(item1).NoneParameter().ExecuteAffrows()); + } + class TS_TEXT01 + { + public Guid Id { get; set; } + [Column(DbType = "text")] + 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.dameng.Insert(item1).ExecuteAffrows()); + + var item2 = g.dameng.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.Throws(() => g.dameng.Insert(item1).NoneParameter().ExecuteAffrows()); + //DmException: ַض + } + class TS_BLB01 + { + public Guid Id { get; set; } + public byte[] Data { get; set; } + } [Fact] public void StringLength() { @@ -238,11 +306,6 @@ namespace FreeSql.Tests.Dameng [Fact] public void CurdAllField() { - var item = new TableAllType { }; - item.Id = (int)insert.AppendData(item).ExecuteIdentity(); - - var newitem = select.Where(a => a.Id == item.Id).ToOne(); - var item2 = new TableAllType { Bool = true, diff --git a/FreeSql.Tests/FreeSql.Tests/Dameng/MapType/BoolNullableTest.cs b/FreeSql.Tests/FreeSql.Tests/Dameng/MapType/BoolNullableTest.cs index d9b748ac..5932dd22 100644 --- a/FreeSql.Tests/FreeSql.Tests/Dameng/MapType/BoolNullableTest.cs +++ b/FreeSql.Tests/FreeSql.Tests/Dameng/MapType/BoolNullableTest.cs @@ -1497,15 +1497,6 @@ namespace FreeSql.Tests.DamengMapType Assert.Equal(item.tostring, find.tostring); Assert.Equal(false, find.tostring); - item = new BoolNullableMap { tostring = null }; - Assert.Equal(1, orm.Insert().AppendData(item).ExecuteAffrows()); - Assert.Null(orm.Select().Where(a => a.id == item.id && a.tostring == false).First()); - find = orm.Select().Where(a => a.id == item.id && a.tostring == null).First(); - Assert.NotNull(find); - Assert.Equal(item.id, find.id); - Assert.Equal(item.tostring, find.tostring); - Assert.Null(find.tostring); - //update all item.tostring = true; Assert.Equal(1, orm.Update().SetSource(item).ExecuteAffrows()); @@ -1523,15 +1514,6 @@ namespace FreeSql.Tests.DamengMapType Assert.Equal(item.tostring, find.tostring); Assert.Equal(false, find.tostring); - item.tostring = null; - Assert.Equal(1, orm.Update().SetSource(item).ExecuteAffrows()); - Assert.Null(orm.Select().Where(a => a.id == item.id && a.tostring == false).First()); - find = orm.Select().Where(a => a.id == item.id && a.tostring == null).First(); - Assert.NotNull(find); - Assert.Equal(item.id, find.id); - Assert.Equal(item.tostring, find.tostring); - Assert.Null(find.tostring); - //update set Assert.Equal(1, orm.Update().Where(a => a.id == item.id).Set(a => a.tostring, true).ExecuteAffrows()); find = orm.Select().Where(a => a.id == item.id && a.tostring == true).First(); @@ -1545,17 +1527,9 @@ namespace FreeSql.Tests.DamengMapType Assert.Equal(item.id, find.id); Assert.Equal(false, find.tostring); - Assert.Equal(1, orm.Update().Where(a => a.id == item.id).Set(a => a.tostring, null).ExecuteAffrows()); - Assert.Null(orm.Select().Where(a => a.id == item.id && a.tostring == false).First()); - find = orm.Select().Where(a => a.id == item.id && a.tostring == null).First(); - Assert.NotNull(find); - Assert.Equal(item.id, find.id); - Assert.Null(find.tostring); - //delete Assert.Equal(0, orm.Delete().Where(a => a.id == item.id && a.tostring == true).ExecuteAffrows()); - Assert.Equal(0, orm.Delete().Where(a => a.id == item.id && a.tostring == false).ExecuteAffrows()); - Assert.Equal(1, orm.Delete().Where(a => a.id == item.id && a.tostring == null).ExecuteAffrows()); + Assert.Equal(1, orm.Delete().Where(a => a.id == item.id && a.tostring == false).ExecuteAffrows()); Assert.Null(orm.Select().Where(a => a.id == item.id).First()); } diff --git a/FreeSql.Tests/FreeSql.Tests/Dameng/MapType/EnumTest.cs b/FreeSql.Tests/FreeSql.Tests/Dameng/MapType/EnumTest.cs index 44e4c52b..2de960fb 100644 --- a/FreeSql.Tests/FreeSql.Tests/Dameng/MapType/EnumTest.cs +++ b/FreeSql.Tests/FreeSql.Tests/Dameng/MapType/EnumTest.cs @@ -84,17 +84,9 @@ namespace FreeSql.Tests.DamengMapType { //insert var orm = g.dameng; - var item = new EnumTestMap { }; + var item = new EnumTestMap { enumnullable_to_string = ToStringMapEnum.й }; Assert.Equal(1, orm.Insert().AppendData(item).ExecuteAffrows()); - var find = orm.Select().Where(a => a.id == item.id && a.enumnullable_to_string == null).First(); - Assert.NotNull(find); - Assert.Equal(item.id, find.id); - Assert.Equal(item.enumnullable_to_string, find.enumnullable_to_string); - Assert.Null(find.enumnullable_to_string); - - item = new EnumTestMap { enumnullable_to_string = ToStringMapEnum.й }; - Assert.Equal(1, orm.Insert().AppendData(item).ExecuteAffrows()); - find = orm.Select().Where(a => a.id == item.id && a.enumnullable_to_string == ToStringMapEnum.й).First(); + var find = orm.Select().Where(a => a.id == item.id && a.enumnullable_to_string == ToStringMapEnum.й).First(); Assert.NotNull(find); Assert.Equal(item.id, find.id); Assert.Equal(item.enumnullable_to_string, find.enumnullable_to_string); @@ -109,15 +101,6 @@ namespace FreeSql.Tests.DamengMapType Assert.Equal(item.enumnullable_to_string, find.enumnullable_to_string); Assert.Equal(ToStringMapEnum., find.enumnullable_to_string); - item.enumnullable_to_string = null; - Assert.Equal(1, orm.Update().SetSource(item).ExecuteAffrows()); - Assert.Null(orm.Select().Where(a => a.id == item.id && a.enumnullable_to_string == ToStringMapEnum.).First()); - find = orm.Select().Where(a => a.id == item.id && a.enumnullable_to_string == null).First(); - Assert.NotNull(find); - Assert.Equal(item.id, find.id); - Assert.Equal(item.enumnullable_to_string, find.enumnullable_to_string); - Assert.Null(find.enumnullable_to_string); - //update set Assert.Equal(1, orm.Update().Where(a => a.id == item.id).Set(a => a.enumnullable_to_string, ToStringMapEnum.abc).ExecuteAffrows()); find = orm.Select().Where(a => a.id == item.id && a.enumnullable_to_string == ToStringMapEnum.abc).First(); @@ -125,19 +108,10 @@ namespace FreeSql.Tests.DamengMapType Assert.Equal(item.id, find.id); Assert.Equal(ToStringMapEnum.abc, find.enumnullable_to_string); - - Assert.Equal(1, orm.Update().Where(a => a.id == item.id).Set(a => a.enumnullable_to_string, null).ExecuteAffrows()); - Assert.Null(orm.Select().Where(a => a.id == item.id && a.enumnullable_to_string == ToStringMapEnum.abc).First()); - find = orm.Select().Where(a => a.id == item.id && a.enumnullable_to_string == null).First(); - Assert.NotNull(find); - Assert.Equal(item.id, find.id); - Assert.Null(find.enumnullable_to_string); - //delete Assert.Equal(0, orm.Delete().Where(a => a.id == item.id && a.enumnullable_to_string == ToStringMapEnum.й).ExecuteAffrows()); Assert.Equal(0, orm.Delete().Where(a => a.id == item.id && a.enumnullable_to_string == ToStringMapEnum.).ExecuteAffrows()); - Assert.Equal(1, orm.Delete().Where(a => a.id == item.id && a.enumnullable_to_string == null).ExecuteAffrows()); - Assert.Null(orm.Select().Where(a => a.id == item.id).First()); + Assert.NotNull(orm.Select().Where(a => a.id == item.id).First()); } [Fact] diff --git a/FreeSql.Tests/FreeSql.Tests/Dameng/MapType/ToStringTest.cs b/FreeSql.Tests/FreeSql.Tests/Dameng/MapType/ToStringTest.cs index fbe05387..f3d35cef 100644 --- a/FreeSql.Tests/FreeSql.Tests/Dameng/MapType/ToStringTest.cs +++ b/FreeSql.Tests/FreeSql.Tests/Dameng/MapType/ToStringTest.cs @@ -99,17 +99,9 @@ namespace FreeSql.Tests.DamengMapType { //insert var orm = g.dameng; - var item = new ToStringMap { }; + var item = new ToStringMap { enumnullable_to_string = ToStringMapEnum.й }; Assert.Equal(1, orm.Insert().AppendData(item).ExecuteAffrows()); - var find = orm.Select().Where(a => a.id == item.id && a.enumnullable_to_string == null).First(); - Assert.NotNull(find); - Assert.Equal(item.id, find.id); - Assert.Equal(item.enumnullable_to_string, find.enumnullable_to_string); - Assert.Null(find.enumnullable_to_string); - - item = new ToStringMap { enumnullable_to_string = ToStringMapEnum.й }; - Assert.Equal(1, orm.Insert().AppendData(item).ExecuteAffrows()); - find = orm.Select().Where(a => a.id == item.id && a.enumnullable_to_string == ToStringMapEnum.й).First(); + var find = orm.Select().Where(a => a.id == item.id && a.enumnullable_to_string == ToStringMapEnum.й).First(); Assert.NotNull(find); Assert.Equal(item.id, find.id); Assert.Equal(item.enumnullable_to_string, find.enumnullable_to_string); @@ -124,15 +116,6 @@ namespace FreeSql.Tests.DamengMapType Assert.Equal(item.enumnullable_to_string, find.enumnullable_to_string); Assert.Equal(ToStringMapEnum., find.enumnullable_to_string); - item.enumnullable_to_string = null; - Assert.Equal(1, orm.Update().SetSource(item).ExecuteAffrows()); - Assert.Null(orm.Select().Where(a => a.id == item.id && a.enumnullable_to_string == ToStringMapEnum.).First()); - find = orm.Select().Where(a => a.id == item.id && a.enumnullable_to_string == null).First(); - Assert.NotNull(find); - Assert.Equal(item.id, find.id); - Assert.Equal(item.enumnullable_to_string, find.enumnullable_to_string); - Assert.Null(find.enumnullable_to_string); - //update set Assert.Equal(1, orm.Update().Where(a => a.id == item.id).Set(a => a.enumnullable_to_string, ToStringMapEnum.abc).ExecuteAffrows()); find = orm.Select().Where(a => a.id == item.id && a.enumnullable_to_string == ToStringMapEnum.abc).First(); @@ -140,19 +123,10 @@ namespace FreeSql.Tests.DamengMapType Assert.Equal(item.id, find.id); Assert.Equal(ToStringMapEnum.abc, find.enumnullable_to_string); - - Assert.Equal(1, orm.Update().Where(a => a.id == item.id).Set(a => a.enumnullable_to_string, null).ExecuteAffrows()); - Assert.Null(orm.Select().Where(a => a.id == item.id && a.enumnullable_to_string == ToStringMapEnum.abc).First()); - find = orm.Select().Where(a => a.id == item.id && a.enumnullable_to_string == null).First(); - Assert.NotNull(find); - Assert.Equal(item.id, find.id); - Assert.Null(find.enumnullable_to_string); - //delete Assert.Equal(0, orm.Delete().Where(a => a.id == item.id && a.enumnullable_to_string == ToStringMapEnum.й).ExecuteAffrows()); Assert.Equal(0, orm.Delete().Where(a => a.id == item.id && a.enumnullable_to_string == ToStringMapEnum.).ExecuteAffrows()); - Assert.Equal(1, orm.Delete().Where(a => a.id == item.id && a.enumnullable_to_string == null).ExecuteAffrows()); - Assert.Null(orm.Select().Where(a => a.id == item.id).First()); + Assert.NotNull(orm.Select().Where(a => a.id == item.id).First()); } [Fact] public void BigInteger1() @@ -216,17 +190,9 @@ namespace FreeSql.Tests.DamengMapType { //insert var orm = g.dameng; - var item = new ToStringMap { }; + var item = new ToStringMap { bigintegernullable_to_string = 101 }; Assert.Equal(1, orm.Insert().AppendData(item).ExecuteAffrows()); - var find = orm.Select().Where(a => a.id == item.id && a.bigintegernullable_to_string == null).First(); - Assert.NotNull(find); - Assert.Equal(item.id, find.id); - Assert.Equal(item.bigintegernullable_to_string, find.bigintegernullable_to_string); - Assert.Null(find.bigintegernullable_to_string); - - item = new ToStringMap { bigintegernullable_to_string = 101 }; - Assert.Equal(1, orm.Insert().AppendData(item).ExecuteAffrows()); - find = orm.Select().Where(a => a.id == item.id && a.bigintegernullable_to_string == 101).First(); + var find = orm.Select().Where(a => a.id == item.id && a.bigintegernullable_to_string == 101).First(); Assert.NotNull(find); Assert.Equal(item.id, find.id); Assert.Equal(item.bigintegernullable_to_string, find.bigintegernullable_to_string); @@ -241,15 +207,6 @@ namespace FreeSql.Tests.DamengMapType Assert.Equal(item.bigintegernullable_to_string, find.bigintegernullable_to_string); Assert.Equal(2004, find.bigintegernullable_to_string); - item.bigintegernullable_to_string = null; - Assert.Equal(1, orm.Update().SetSource(item).ExecuteAffrows()); - Assert.Null(orm.Select().Where(a => a.id == item.id && a.bigintegernullable_to_string == 2004).First()); - find = orm.Select().Where(a => a.id == item.id && a.bigintegernullable_to_string == null).First(); - Assert.NotNull(find); - Assert.Equal(item.id, find.id); - Assert.Equal(item.bigintegernullable_to_string, find.bigintegernullable_to_string); - Assert.Null(find.bigintegernullable_to_string); - //update set Assert.Equal(1, orm.Update().Where(a => a.id == item.id).Set(a => a.bigintegernullable_to_string, 998).ExecuteAffrows()); find = orm.Select().Where(a => a.id == item.id && a.bigintegernullable_to_string == 998).First(); @@ -257,18 +214,9 @@ namespace FreeSql.Tests.DamengMapType Assert.Equal(item.id, find.id); Assert.Equal(998, find.bigintegernullable_to_string); - - Assert.Equal(1, orm.Update().Where(a => a.id == item.id).Set(a => a.bigintegernullable_to_string, null).ExecuteAffrows()); - Assert.Null(orm.Select().Where(a => a.id == item.id && a.bigintegernullable_to_string == 998).First()); - find = orm.Select().Where(a => a.id == item.id && a.bigintegernullable_to_string == null).First(); - Assert.NotNull(find); - Assert.Equal(item.id, find.id); - Assert.Null(find.bigintegernullable_to_string); - //delete - Assert.Equal(0, orm.Delete().Where(a => a.id == item.id && a.bigintegernullable_to_string == 998).ExecuteAffrows()); + Assert.Equal(1, orm.Delete().Where(a => a.id == item.id && a.bigintegernullable_to_string == 998).ExecuteAffrows()); Assert.Equal(0, orm.Delete().Where(a => a.id == item.id && a.bigintegernullable_to_string == 2004).ExecuteAffrows()); - Assert.Equal(1, orm.Delete().Where(a => a.id == item.id && a.bigintegernullable_to_string == null).ExecuteAffrows()); Assert.Null(orm.Select().Where(a => a.id == item.id).First()); } [Fact] @@ -513,18 +461,10 @@ namespace FreeSql.Tests.DamengMapType { //insert var orm = g.dameng; - var item = new ToStringMap { }; - Assert.Equal(1, orm.Insert().AppendData(item).ExecuteAffrows()); - var find = orm.Select().Where(a => a.id == item.id && a.guidnullable_to_string == null).First(); - Assert.NotNull(find); - Assert.Equal(item.id, find.id); - Assert.Equal(item.guidnullable_to_string, find.guidnullable_to_string); - Assert.Null(find.guidnullable_to_string); - var newid = Guid.NewGuid(); - item = new ToStringMap { guidnullable_to_string = newid }; + var item = new ToStringMap { guidnullable_to_string = newid }; Assert.Equal(1, orm.Insert().AppendData(item).ExecuteAffrows()); - find = orm.Select().Where(a => a.id == item.id && a.guidnullable_to_string == newid).First(); + var find = orm.Select().Where(a => a.id == item.id && a.guidnullable_to_string == newid).First(); Assert.NotNull(find); Assert.Equal(item.id, find.id); Assert.Equal(item.guidnullable_to_string, find.guidnullable_to_string); @@ -540,14 +480,6 @@ namespace FreeSql.Tests.DamengMapType Assert.Equal(item.guidnullable_to_string, find.guidnullable_to_string); Assert.Equal(newid, find.guidnullable_to_string); - item.guidnullable_to_string = null; - Assert.Equal(1, orm.Update().SetSource(item).ExecuteAffrows()); - find = orm.Select().Where(a => a.id == item.id && a.guidnullable_to_string == null).First(); - Assert.NotNull(find); - Assert.Equal(item.id, find.id); - Assert.Equal(item.guidnullable_to_string, find.guidnullable_to_string); - Assert.Null(find.guidnullable_to_string); - //update set newid = Guid.NewGuid(); Assert.Equal(1, orm.Update().Where(a => a.id == item.id).Set(a => a.guidnullable_to_string, newid).ExecuteAffrows()); @@ -556,14 +488,8 @@ namespace FreeSql.Tests.DamengMapType Assert.Equal(item.id, find.id); Assert.Equal(newid, find.guidnullable_to_string); - Assert.Equal(1, orm.Update().Where(a => a.id == item.id).Set(a => a.guidnullable_to_string, null).ExecuteAffrows()); - find = orm.Select().Where(a => a.id == item.id && a.guidnullable_to_string == null).First(); - Assert.NotNull(find); - Assert.Equal(item.id, find.id); - Assert.Null(find.guidnullable_to_string); - //delete - Assert.Equal(1, orm.Delete().Where(a => a.id == item.id && a.guidnullable_to_string == null).ExecuteAffrows()); + Assert.Equal(1, orm.Delete().Where(a => a.id == item.id).ExecuteAffrows()); Assert.Null(orm.Select().Where(a => a.id == item.id).First()); } } diff --git a/FreeSql.Tests/FreeSql.Tests/MySql/MySqlCodeFirstTest.cs b/FreeSql.Tests/FreeSql.Tests/MySql/MySqlCodeFirstTest.cs index 27a3ab52..809cc6a3 100644 --- a/FreeSql.Tests/FreeSql.Tests/MySql/MySqlCodeFirstTest.cs +++ b/FreeSql.Tests/FreeSql.Tests/MySql/MySqlCodeFirstTest.cs @@ -10,6 +10,94 @@ namespace FreeSql.Tests.MySql { public class MySqlCodeFirstTest { + [Fact] + public void Text_StringLength_1() + { + var str1 = string.Join(",", Enumerable.Range(0, 1000).Select(a => "й")); + + var item1 = new TS_TEXT02 { Data = str1 }; + Assert.Equal(1, g.mysql.Insert(item1).ExecuteAffrows()); + + var item2 = g.mysql.Select().Where(a => a.Id == item1.Id).First(); + Assert.Equal(str1, item2.Data); + + //NoneParameter + item1 = new TS_TEXT02 { Data = str1 }; + Assert.Equal(1, g.mysql.Insert(item1).NoneParameter().ExecuteAffrows()); + } + class TS_TEXT02 + { + public Guid Id { get; set; } + [Column(StringLength = -1)] + public string Data { get; set; } + } + + [Fact] + public void Text() + { + var str1 = string.Join(",", Enumerable.Range(0, 1000).Select(a => "й")); + + var item1 = new TS_TEXT01 { Data = str1 }; + Assert.Equal(1, g.mysql.Insert(item1).ExecuteAffrows()); + + var item2 = g.mysql.Select().Where(a => a.Id == item1.Id).First(); + Assert.Equal(str1, item2.Data); + + //NoneParameter + item1 = new TS_TEXT01 { Data = str1 }; + Assert.Equal(1, g.mysql.Insert(item1).NoneParameter().ExecuteAffrows()); + } + class TS_TEXT01 + { + public Guid Id { get; set; } + [Column(DbType = "text")] + public string Data { get; set; } + } + + [Fact] + public void Text_StringLength_2() + { + var str1 = string.Join(",", Enumerable.Range(0, 10000).Select(a => "й")); + + var item1 = new TS_TEXT04 { Data = str1 }; + Assert.Equal(1, g.mysql.Insert(item1).ExecuteAffrows()); + + var item2 = g.mysql.Select().Where(a => a.Id == item1.Id).First(); + Assert.Equal(str1, item2.Data); + + //NoneParameter + item1 = new TS_TEXT04 { Data = str1 }; + Assert.Equal(1, g.mysql.Insert(item1).NoneParameter().ExecuteAffrows()); + } + class TS_TEXT04 + { + public Guid Id { get; set; } + [Column(StringLength = -2)] + public string Data { get; set; } + } + + [Fact] + public void LongText() + { + var str1 = string.Join(",", Enumerable.Range(0, 10000).Select(a => "й")); + + var item1 = new TS_TEXT03 { Data = str1 }; + Assert.Equal(1, g.mysql.Insert(item1).ExecuteAffrows()); + + var item2 = g.mysql.Select().Where(a => a.Id == item1.Id).First(); + Assert.Equal(str1, item2.Data); + + //NoneParameter + item1 = new TS_TEXT03 { Data = str1 }; + Assert.Equal(1, g.mysql.Insert(item1).NoneParameter().ExecuteAffrows()); + } + class TS_TEXT03 + { + public Guid Id { get; set; } + [Column(DbType = "longtext")] + public string Data { get; set; } + } + [Fact] public void StringLength() { diff --git a/FreeSql/DataAnnotations/ColumnAttribute.cs b/FreeSql/DataAnnotations/ColumnAttribute.cs index 96cc37b5..ae45c75c 100644 --- a/FreeSql/DataAnnotations/ColumnAttribute.cs +++ b/FreeSql/DataAnnotations/ColumnAttribute.cs @@ -89,11 +89,11 @@ namespace FreeSql.DataAnnotations /// Oracle -> nvarchar2(100) /// Sqlite -> nvarchar(100) /// --- - /// StringLength = -1 时,对应 DbType: - /// MySql -> text + /// StringLength < 0 时,对应 DbType: + /// MySql -> text (StringLength = -2 时,对应 DbType longtext) /// SqlServer -> nvarchar(max) /// PostgreSQL -> text - /// Oracle -> nvarchar2(4000) + /// Oracle -> nclob /// Sqlite -> text /// public int StringLength { get => _StringLength ?? 0; set => _StringLength = value; } diff --git a/FreeSql/FreeSql.xml b/FreeSql/FreeSql.xml index b9a3434c..97257dce 100644 --- a/FreeSql/FreeSql.xml +++ b/FreeSql/FreeSql.xml @@ -90,11 +90,11 @@ Oracle -> nvarchar2(100) Sqlite -> nvarchar(100) --- - StringLength = -1 时,对应 DbType: - MySql -> text + StringLength < 0 时,对应 DbType: + MySql -> text (StringLength = -2 时,对应 DbType longtext) SqlServer -> nvarchar(max) PostgreSQL -> text - Oracle -> nvarchar2(4000) + Oracle -> nclob Sqlite -> text diff --git a/FreeSql/Internal/CommonProvider/SelectProvider/Select0Provider.cs b/FreeSql/Internal/CommonProvider/SelectProvider/Select0Provider.cs index 5841a265..88b3bdf2 100644 --- a/FreeSql/Internal/CommonProvider/SelectProvider/Select0Provider.cs +++ b/FreeSql/Internal/CommonProvider/SelectProvider/Select0Provider.cs @@ -1218,12 +1218,12 @@ namespace FreeSql.Internal.CommonProvider break; case DataType.Oracle: case DataType.OdbcOracle: + case DataType.Dameng: + case DataType.OdbcDameng: _tosqlAppendContent = $" for update{(noawait ? " nowait" : "")}"; break; case DataType.Sqlite: break; - case DataType.OdbcDameng: - case DataType.Dameng: case DataType.OdbcKingbaseES: _tosqlAppendContent = $" for update{(noawait ? " nowait" : "")}"; break; diff --git a/FreeSql/Internal/UtilsExpressionTree.cs b/FreeSql/Internal/UtilsExpressionTree.cs index 4d21d6d9..5c036e53 100644 --- a/FreeSql/Internal/UtilsExpressionTree.cs +++ b/FreeSql/Internal/UtilsExpressionTree.cs @@ -232,7 +232,8 @@ namespace FreeSql.Internal { case DataType.MySql: case DataType.OdbcMySql: - if (strlen < 0) colattr.DbType = "TEXT"; + if (strlen == -2) colattr.DbType = "LONGTEXT"; + else if (strlen < 0) colattr.DbType = "TEXT"; else colattr.DbType = Regex.Replace(colattr.DbType, charPatten, $"$1({strlen})"); break; case DataType.SqlServer: @@ -250,9 +251,13 @@ namespace FreeSql.Internal if (strlen < 0) colattr.DbType = "NCLOB"; //v1.3.2+ https://github.com/dotnetcore/FreeSql/issues/259 else colattr.DbType = Regex.Replace(colattr.DbType, charPatten, $"$1({strlen})"); break; + case DataType.Dameng: + if (strlen < 0) colattr.DbType = "TEXT"; + else colattr.DbType = Regex.Replace(colattr.DbType, charPatten, $"$1({strlen})"); + break; case DataType.OdbcOracle: case DataType.OdbcDameng: - if (strlen < 0) colattr.DbType = Regex.Replace(colattr.DbType, charPatten, $"$1(4000)"); + if (strlen < 0) colattr.DbType = Regex.Replace(colattr.DbType, charPatten, $"$1(4000)"); //ODBC 不支持 NCLOB else colattr.DbType = Regex.Replace(colattr.DbType, charPatten, $"$1({strlen})"); break; case DataType.Sqlite: diff --git a/Providers/FreeSql.Provider.Dameng/DamengCodeFirst.cs b/Providers/FreeSql.Provider.Dameng/DamengCodeFirst.cs index 67910e61..09cb67f1 100644 --- a/Providers/FreeSql.Provider.Dameng/DamengCodeFirst.cs +++ b/Providers/FreeSql.Provider.Dameng/DamengCodeFirst.cs @@ -15,7 +15,6 @@ namespace FreeSql.Dameng class DamengCodeFirst : Internal.CommonProvider.CodeFirstProvider { - public override bool IsNoneCommandParameter { get => true; set => base.IsNoneCommandParameter = true; } public DamengCodeFirst(IFreeSql orm, CommonUtils commonUtils, CommonExpression commonExpression) : base(orm, commonUtils, commonExpression) { } static object _dicCsToDbLock = new object(); @@ -310,8 +309,9 @@ and not exists(select 1 from all_constraints where index_name = a.index_name and continue; } var oldpk = _orm.Ado.ExecuteScalar(CommandType.Text, _commonUtils.FormatSql(@" select constraint_name from user_constraints where owner={0} and table_name={1} and constraint_type='P'", tbname))?.ToString(); - if (string.IsNullOrEmpty(oldpk) == false) - sb.Append("execute immediate 'ALTER TABLE ").Append(_commonUtils.QuoteSqlName($"{tbname[0]}.{tbname[1]}")).Append(" DROP CONSTRAINT ").Append(oldpk).Append("';\r\n"); + //if (string.IsNullOrEmpty(oldpk) == false) + // sb.Append("execute immediate 'ALTER TABLE ").Append(_commonUtils.QuoteSqlName($"{tbname[0]}.{tbname[1]}")).Append(" DROP CONSTRAINT ").Append(_commonUtils.QuoteSqlName(oldpk)).Append("';\r\n"); + //执行失败(语句1) 试图删除聚集主键 //创建临时表,数据导进临时表,然后删除原表,将临时表改名为原表名 var tablename = tboldname == null ? _commonUtils.QuoteSqlName($"{tbname[0]}.{tbname[1]}") : _commonUtils.QuoteSqlName($"{tboldname[0]}.{tboldname[1]}"); @@ -325,7 +325,8 @@ and not exists(select 1 from all_constraints where index_name = a.index_name and } if (tb.Primarys.Any()) { - var pkname = primaryKeyName ?? $"{tbname[0]}_{tbname[1]}_pk2"; + var pkname = primaryKeyName ?? $"{tbname[0]}_{tbname[1]}_pk1"; + if (string.IsNullOrEmpty(oldpk) == false && oldpk == pkname) pkname = $"{pkname}1"; sb.Append(" \r\n CONSTRAINT ").Append(_commonUtils.QuoteSqlName(pkname)).Append(" PRIMARY KEY ("); foreach (var tbcol in tb.Primarys) sb.Append(_commonUtils.QuoteSqlName(tbcol.Attribute.Name)).Append(", "); sb.Remove(sb.Length - 2, 2).Append("),"); @@ -457,6 +458,15 @@ and not exists(select 1 from all_constraints where index_name = a.index_name and else if (sqlType.StartsWith("BLOB")) { } + else if (sqlType.StartsWith("CLOB")) + { + } + else if (sqlType.StartsWith("NCLOB")) + { + } + else if (sqlType.StartsWith("TEXT")) + { + } else if (sqlType == "REAL" || sqlType == "DOUBLE" || sqlType == "FLOAT") { } diff --git a/Providers/FreeSql.Provider.Odbc/Dameng/OdbcDamengCodeFirst.cs b/Providers/FreeSql.Provider.Odbc/Dameng/OdbcDamengCodeFirst.cs index 1440f806..bca00ccd 100644 --- a/Providers/FreeSql.Provider.Odbc/Dameng/OdbcDamengCodeFirst.cs +++ b/Providers/FreeSql.Provider.Odbc/Dameng/OdbcDamengCodeFirst.cs @@ -310,8 +310,9 @@ and not exists(select 1 from all_constraints where index_name = a.index_name and continue; } var oldpk = _orm.Ado.ExecuteScalar(CommandType.Text, _commonUtils.FormatSql(@" select constraint_name from user_constraints where owner={0} and table_name={1} and constraint_type='P'", tbname))?.ToString(); - if (string.IsNullOrEmpty(oldpk) == false) - sb.Append("execute immediate 'ALTER TABLE ").Append(_commonUtils.QuoteSqlName($"{tbname[0]}.{tbname[1]}")).Append(" DROP CONSTRAINT ").Append(oldpk).Append("';\r\n"); + //if (string.IsNullOrEmpty(oldpk) == false) + // sb.Append("execute immediate 'ALTER TABLE ").Append(_commonUtils.QuoteSqlName($"{tbname[0]}.{tbname[1]}")).Append(" DROP CONSTRAINT ").Append(_commonUtils.QuoteSqlName(oldpk)).Append("';\r\n"); + //执行失败(语句1) 试图删除聚集主键 //创建临时表,数据导进临时表,然后删除原表,将临时表改名为原表名 var tablename = tboldname == null ? _commonUtils.QuoteSqlName($"{tbname[0]}.{tbname[1]}") : _commonUtils.QuoteSqlName($"{tboldname[0]}.{tboldname[1]}"); @@ -325,7 +326,8 @@ and not exists(select 1 from all_constraints where index_name = a.index_name and } if (tb.Primarys.Any()) { - var pkname = primaryKeyName ?? $"{tbname[0]}_{tbname[1]}_pk2"; + var pkname = primaryKeyName ?? $"{tbname[0]}_{tbname[1]}_pk1"; + if (string.IsNullOrEmpty(oldpk) == false && oldpk == pkname) pkname = $"{pkname}1"; sb.Append(" \r\n CONSTRAINT ").Append(_commonUtils.QuoteSqlName(pkname)).Append(" PRIMARY KEY ("); foreach (var tbcol in tb.Primarys) sb.Append(_commonUtils.QuoteSqlName(tbcol.Attribute.Name)).Append(", "); sb.Remove(sb.Length - 2, 2).Append("),"); diff --git a/Providers/FreeSql.Provider.Odbc/Oracle/OdbcOracleCodeFirst.cs b/Providers/FreeSql.Provider.Odbc/Oracle/OdbcOracleCodeFirst.cs index f1d03da1..8120f32c 100644 --- a/Providers/FreeSql.Provider.Odbc/Oracle/OdbcOracleCodeFirst.cs +++ b/Providers/FreeSql.Provider.Odbc/Oracle/OdbcOracleCodeFirst.cs @@ -309,7 +309,7 @@ and not exists(select 1 from all_constraints where constraint_name = a.index_nam } var oldpk = _orm.Ado.ExecuteScalar(CommandType.Text, _commonUtils.FormatSql(@" select constraint_name from user_constraints where owner={0} and table_name={1} and constraint_type='P'", tbname))?.ToString(); if (string.IsNullOrEmpty(oldpk) == false) - sb.Append("execute immediate 'ALTER TABLE ").Append(_commonUtils.QuoteSqlName($"{tbname[0]}.{tbname[1]}")).Append(" DROP CONSTRAINT ").Append(oldpk).Append("';\r\n"); + sb.Append("execute immediate 'ALTER TABLE ").Append(_commonUtils.QuoteSqlName($"{tbname[0]}.{tbname[1]}")).Append(" DROP CONSTRAINT ").Append(_commonUtils.QuoteSqlName(oldpk)).Append("';\r\n"); //创建临时表,数据导进临时表,然后删除原表,将临时表改名为原表名 var tablename = tboldname == null ? _commonUtils.QuoteSqlName($"{tbname[0]}.{tbname[1]}") : _commonUtils.QuoteSqlName($"{tboldname[0]}.{tboldname[1]}"); diff --git a/Providers/FreeSql.Provider.Oracle/OracleCodeFirst.cs b/Providers/FreeSql.Provider.Oracle/OracleCodeFirst.cs index fbc93fe7..f7236949 100644 --- a/Providers/FreeSql.Provider.Oracle/OracleCodeFirst.cs +++ b/Providers/FreeSql.Provider.Oracle/OracleCodeFirst.cs @@ -310,7 +310,7 @@ and not exists(select 1 from all_constraints where constraint_name = a.index_nam } var oldpk = _orm.Ado.ExecuteScalar(CommandType.Text, _commonUtils.FormatSql(@" select constraint_name from user_constraints where owner={0} and table_name={1} and constraint_type='P'", tbname))?.ToString(); if (string.IsNullOrEmpty(oldpk) == false) - sb.Append("execute immediate 'ALTER TABLE ").Append(_commonUtils.QuoteSqlName($"{tbname[0]}.{tbname[1]}")).Append(" DROP CONSTRAINT ").Append(oldpk).Append("';\r\n"); + sb.Append("execute immediate 'ALTER TABLE ").Append(_commonUtils.QuoteSqlName($"{tbname[0]}.{tbname[1]}")).Append(" DROP CONSTRAINT ").Append(_commonUtils.QuoteSqlName(oldpk)).Append("';\r\n"); //创建临时表,数据导进临时表,然后删除原表,将临时表改名为原表名 var tablename = tboldname == null ? _commonUtils.QuoteSqlName($"{tbname[0]}.{tbname[1]}") : _commonUtils.QuoteSqlName($"{tboldname[0]}.{tboldname[1]}");