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]}");