From 0e82d6c3e34b5324dcf5e534a504049e7fa66d77 Mon Sep 17 00:00:00 2001 From: 2881099 <2881099@qq.com> Date: Thu, 30 Jun 2022 13:54:51 +0800 Subject: [PATCH] =?UTF-8?q?-=20=E4=BC=98=E5=8C=96=20IUpdate=20ToSql?= =?UTF-8?q?=EF=BC=9B?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- FreeSql.DbContext/FreeSql.DbContext.xml | 9 - .../RepositoryTests.cs | 570 +++++++++--------- .../Sqlite/Curd/SqliteUpdateTest.cs | 5 +- .../Internal/CommonProvider/DeleteProvider.cs | 1 + .../Internal/CommonProvider/UpdateProvider.cs | 2 + .../Curd/ClickHouseDelete.cs | 2 +- .../Curd/ClickHouseUpdate.cs | 1 + 7 files changed, 306 insertions(+), 284 deletions(-) diff --git a/FreeSql.DbContext/FreeSql.DbContext.xml b/FreeSql.DbContext/FreeSql.DbContext.xml index 26522f10..537315e2 100644 --- a/FreeSql.DbContext/FreeSql.DbContext.xml +++ b/FreeSql.DbContext/FreeSql.DbContext.xml @@ -800,14 +800,5 @@ - - - 批量注入 Repository,可以参考代码自行调整 - - - - - - diff --git a/FreeSql.Tests/FreeSql.Tests.DbContext/RepositoryTests.cs b/FreeSql.Tests/FreeSql.Tests.DbContext/RepositoryTests.cs index da9d1d2c..8f82d3cc 100644 --- a/FreeSql.Tests/FreeSql.Tests.DbContext/RepositoryTests.cs +++ b/FreeSql.Tests/FreeSql.Tests.DbContext/RepositoryTests.cs @@ -1,6 +1,8 @@ using FreeSql.DataAnnotations; +using Newtonsoft.Json.Linq; using System; using System.Collections.Generic; +using System.Diagnostics; using System.Linq; using System.Threading.Tasks; using Xunit; @@ -12,180 +14,196 @@ namespace FreeSql.Tests [Fact] public void DeleteCascade() { - var fsql = g.sqlite; - fsql.Delete().Where("1=1").ExecuteAffrows(); - fsql.Delete().Where("1=1").ExecuteAffrows(); - fsql.Delete().Where("1=1").ExecuteAffrows(); - fsql.Delete().Where("1=1").ExecuteAffrows(); - fsql.Delete().Where("1=1").ExecuteAffrows(); - - var groupRepo = fsql.GetRepository(); - var userRepo = fsql.GetRepository(); - var userextRepo = fsql.GetRepository(); - var tagRepo = fsql.GetRepository(); - groupRepo.DbContextOptions.EnableCascadeSave = true; - userRepo.DbContextOptions.EnableCascadeSave = true; - userextRepo.DbContextOptions.EnableCascadeSave = true; - tagRepo.DbContextOptions.EnableCascadeSave = true; - - //OneToOne InDatabase - fsql.Delete().Where("1=1").ExecuteAffrows(); - fsql.Delete().Where("1=1").ExecuteAffrows(); - var user = new DeleteCascadeUser { Username = "admin01", Password = "pwd01", UserExt = new DeleteCascadeUserExt { Remark = "用户备注01" } }; - userRepo.Insert(user); - var ret = userRepo.DeleteCascadeByDatabase(a => a.Id == user.Id); - Assert.Equal(2, ret.Count); - Assert.IsType(ret[0]); - Assert.Equal(user.UserExt.UserId, (ret[0] as DeleteCascadeUserExt).UserId); - Assert.Equal(user.UserExt.Remark, (ret[0] as DeleteCascadeUserExt).Remark); - Assert.IsType(ret[1]); - Assert.Equal(user.Id, (ret[1] as DeleteCascadeUser).Id); - Assert.Equal(user.Username, (ret[1] as DeleteCascadeUser).Username); - Assert.Equal(user.Password, (ret[1] as DeleteCascadeUser).Password); - //OneToOne EnableCascadeSave InMemory - fsql.Delete().Where("1=1").ExecuteAffrows(); - fsql.Delete().Where("1=1").ExecuteAffrows(); - user = new DeleteCascadeUser { Username = "admin01", Password = "pwd01", UserExt = new DeleteCascadeUserExt { Remark = "用户备注01" } }; - userRepo.Insert(user); - Assert.True(user.Id > 0); - Assert.True(user.UserExt.UserId > 0); - var affrows = userRepo.Delete(user); - Assert.Equal(2, affrows); - Assert.Equal(0, user.Id); - Assert.Equal("admin01", user.Username); - Assert.Equal("pwd01", user.Password); - Assert.True(user.UserExt.UserId > 0); - Assert.Equal("用户备注01", user.UserExt.Remark); - Assert.False(userRepo.Select.Any()); - Assert.False(userextRepo.Select.Any()); - - //OneToOne InDatabase 先删除 UserExt - fsql.Delete().Where("1=1").ExecuteAffrows(); - fsql.Delete().Where("1=1").ExecuteAffrows(); - user = new DeleteCascadeUser { Username = "admin01", Password = "pwd01", UserExt = new DeleteCascadeUserExt { Remark = "用户备注01" } }; - userRepo.Insert(user); - ret = userextRepo.DeleteCascadeByDatabase(a => a.UserId == user.UserExt.UserId); - Assert.Equal(2, ret.Count); - Assert.IsType(ret[1]); - Assert.Equal(user.UserExt.UserId, (ret[1] as DeleteCascadeUserExt).UserId); - Assert.Equal(user.UserExt.Remark, (ret[1] as DeleteCascadeUserExt).Remark); - Assert.IsType(ret[0]); - Assert.Equal(user.Id, (ret[0] as DeleteCascadeUser).Id); - Assert.Equal(user.Username, (ret[0] as DeleteCascadeUser).Username); - Assert.Equal(user.Password, (ret[0] as DeleteCascadeUser).Password); - //OneToOne EnableCascadeSave InMemory 先删除 UserExt - fsql.Delete().Where("1=1").ExecuteAffrows(); - fsql.Delete().Where("1=1").ExecuteAffrows(); - user = new DeleteCascadeUser { Username = "admin01", Password = "pwd01", UserExt = new DeleteCascadeUserExt { Remark = "用户备注01" } }; - userRepo.Insert(user); - Assert.True(user.Id > 0); - Assert.True(user.UserExt.UserId > 0); - var userext = userextRepo.Where(a => a.UserId == user.Id).Include(a => a.User).First(); - Assert.NotNull(userext); - Assert.Equal(user.UserExt.UserId, userext.UserId); - Assert.Equal(user.Id, userext.User.Id); - affrows = userextRepo.Delete(userext); - Assert.Equal(2, affrows); - Assert.Equal(0, userext.User.Id); - Assert.Equal("admin01", userext.User.Username); - Assert.Equal("pwd01", userext.User.Password); - Assert.True(userext.UserId > 0); - Assert.Equal("用户备注01", userext.Remark); - Assert.False(userRepo.Select.Any()); - Assert.False(userextRepo.Select.Any()); - - //OneToMany InDatabase - fsql.Delete().Where("1=1").ExecuteAffrows(); - fsql.Delete().Where("1=1").ExecuteAffrows(); - fsql.Delete().Where("1=1").ExecuteAffrows(); - var group = new DeleteCascadeUserGroup + using (var fsql = new FreeSqlBuilder() + .UseConnectionString(DataType.Sqlite, "data source=:memory:") + .UseAutoSyncStructure(true) + .UseNoneCommandParameter(true) + .UseMonitorCommand(cmd => Trace.WriteLine(cmd.CommandText)) + .Build()) { - GroupName = "group01", - Users = new List + fsql.CodeFirst.GetTableByEntity(typeof(DeleteCascadeUserGroup)).ColumnsByCs + .Where(a => !new[] { typeof(string), typeof(int), typeof(DateTime), typeof(long) }.Contains(a.Value.Attribute.MapType)) + .ToArray(); + + fsql.GlobalFilter.Apply("soft_delete", a => a.IsDeleted == false); + + fsql.Delete().Where("1=1").ExecuteAffrows(); + fsql.Delete().Where("1=1").ExecuteAffrows(); + fsql.Delete().Where("1=1").ExecuteAffrows(); + fsql.Delete().Where("1=1").ExecuteAffrows(); + fsql.Delete().Where("1=1").ExecuteAffrows(); + + var groupRepo = fsql.GetRepository(); + var userRepo = fsql.GetRepository(); + var userextRepo = fsql.GetRepository(); + var tagRepo = fsql.GetRepository(); + groupRepo.DbContextOptions.EnableCascadeSave = true; + userRepo.DbContextOptions.EnableCascadeSave = true; + userextRepo.DbContextOptions.EnableCascadeSave = true; + tagRepo.DbContextOptions.EnableCascadeSave = true; + groupRepo.DbContextOptions.EnableGlobalFilter = false; + userRepo.DbContextOptions.EnableGlobalFilter = false; + userextRepo.DbContextOptions.EnableGlobalFilter = false; + tagRepo.DbContextOptions.EnableGlobalFilter = false; + + //OneToOne InDatabase + fsql.Delete().Where("1=1").ExecuteAffrows(); + fsql.Delete().Where("1=1").ExecuteAffrows(); + var user = new DeleteCascadeUser { Username = "admin01", Password = "pwd01", UserExt = new DeleteCascadeUserExt { Remark = "用户备注01" } }; + userRepo.Insert(user); + var ret = userRepo.DeleteCascadeByDatabase(a => a.Id == user.Id); + Assert.Equal(2, ret.Count); + Assert.IsType(ret[0]); + Assert.Equal(user.UserExt.UserId, (ret[0] as DeleteCascadeUserExt).UserId); + Assert.Equal(user.UserExt.Remark, (ret[0] as DeleteCascadeUserExt).Remark); + Assert.IsType(ret[1]); + Assert.Equal(user.Id, (ret[1] as DeleteCascadeUser).Id); + Assert.Equal(user.Username, (ret[1] as DeleteCascadeUser).Username); + Assert.Equal(user.Password, (ret[1] as DeleteCascadeUser).Password); + //OneToOne EnableCascadeSave InMemory + fsql.Delete().Where("1=1").ExecuteAffrows(); + fsql.Delete().Where("1=1").ExecuteAffrows(); + user = new DeleteCascadeUser { Username = "admin01", Password = "pwd01", UserExt = new DeleteCascadeUserExt { Remark = "用户备注01" } }; + userRepo.Insert(user); + Assert.True(user.Id > 0); + Assert.True(user.UserExt.UserId > 0); + var affrows = userRepo.Delete(user); + Assert.Equal(2, affrows); + Assert.Equal(0, user.Id); + Assert.Equal("admin01", user.Username); + Assert.Equal("pwd01", user.Password); + Assert.True(user.UserExt.UserId > 0); + Assert.Equal("用户备注01", user.UserExt.Remark); + Assert.False(userRepo.Select.Any()); + Assert.False(userextRepo.Select.Any()); + + //OneToOne InDatabase 先删除 UserExt + fsql.Delete().Where("1=1").ExecuteAffrows(); + fsql.Delete().Where("1=1").ExecuteAffrows(); + user = new DeleteCascadeUser { Username = "admin01", Password = "pwd01", UserExt = new DeleteCascadeUserExt { Remark = "用户备注01" } }; + userRepo.Insert(user); + ret = userextRepo.DeleteCascadeByDatabase(a => a.UserId == user.UserExt.UserId); + Assert.Equal(2, ret.Count); + Assert.IsType(ret[1]); + Assert.Equal(user.UserExt.UserId, (ret[1] as DeleteCascadeUserExt).UserId); + Assert.Equal(user.UserExt.Remark, (ret[1] as DeleteCascadeUserExt).Remark); + Assert.IsType(ret[0]); + Assert.Equal(user.Id, (ret[0] as DeleteCascadeUser).Id); + Assert.Equal(user.Username, (ret[0] as DeleteCascadeUser).Username); + Assert.Equal(user.Password, (ret[0] as DeleteCascadeUser).Password); + //OneToOne EnableCascadeSave InMemory 先删除 UserExt + fsql.Delete().Where("1=1").ExecuteAffrows(); + fsql.Delete().Where("1=1").ExecuteAffrows(); + user = new DeleteCascadeUser { Username = "admin01", Password = "pwd01", UserExt = new DeleteCascadeUserExt { Remark = "用户备注01" } }; + userRepo.Insert(user); + Assert.True(user.Id > 0); + Assert.True(user.UserExt.UserId > 0); + var userext = userextRepo.Where(a => a.UserId == user.Id).Include(a => a.User).First(); + Assert.NotNull(userext); + Assert.Equal(user.UserExt.UserId, userext.UserId); + Assert.Equal(user.Id, userext.User.Id); + affrows = userextRepo.Delete(userext); + Assert.Equal(2, affrows); + Assert.Equal(0, userext.User.Id); + Assert.Equal("admin01", userext.User.Username); + Assert.Equal("pwd01", userext.User.Password); + Assert.True(userext.UserId > 0); + Assert.Equal("用户备注01", userext.Remark); + Assert.False(userRepo.Select.Any()); + Assert.False(userextRepo.Select.Any()); + + //OneToMany InDatabase + fsql.Delete().Where("1=1").ExecuteAffrows(); + fsql.Delete().Where("1=1").ExecuteAffrows(); + fsql.Delete().Where("1=1").ExecuteAffrows(); + var group = new DeleteCascadeUserGroup + { + GroupName = "group01", + Users = new List { new DeleteCascadeUser { Username = "admin01", Password = "pwd01", UserExt = new DeleteCascadeUserExt { Remark = "用户备注01" } }, new DeleteCascadeUser { Username = "admin02", Password = "pwd02", UserExt = new DeleteCascadeUserExt { Remark = "用户备注02" } }, new DeleteCascadeUser { Username = "admin03", Password = "pwd03", UserExt = new DeleteCascadeUserExt { Remark = "用户备注03" } }, } - }; - groupRepo.Insert(group); - Assert.Equal(group.Id, group.Users[0].GroupId); - Assert.Equal(group.Id, group.Users[1].GroupId); - Assert.Equal(group.Id, group.Users[2].GroupId); - ret = groupRepo.DeleteCascadeByDatabase(a => a.Id == group.Id); - Assert.Equal(7, ret.Count); - Assert.IsType(ret[0]); - Assert.Equal(group.Users[0].UserExt.UserId, (ret[0] as DeleteCascadeUserExt).UserId); - Assert.Equal(group.Users[0].UserExt.Remark, (ret[0] as DeleteCascadeUserExt).Remark); - Assert.IsType(ret[1]); - Assert.Equal(group.Users[1].UserExt.UserId, (ret[1] as DeleteCascadeUserExt).UserId); - Assert.Equal(group.Users[1].UserExt.Remark, (ret[1] as DeleteCascadeUserExt).Remark); - Assert.IsType(ret[2]); - Assert.Equal(group.Users[2].UserExt.UserId, (ret[2] as DeleteCascadeUserExt).UserId); - Assert.Equal(group.Users[2].UserExt.Remark, (ret[2] as DeleteCascadeUserExt).Remark); - Assert.IsType(ret[3]); - Assert.Equal(group.Users[0].Id, (ret[3] as DeleteCascadeUser).Id); - Assert.Equal(group.Users[0].Username, (ret[3] as DeleteCascadeUser).Username); - Assert.Equal(group.Users[0].Password, (ret[3] as DeleteCascadeUser).Password); - Assert.IsType(ret[4]); - Assert.Equal(group.Users[1].Id, (ret[4] as DeleteCascadeUser).Id); - Assert.Equal(group.Users[1].Username, (ret[4] as DeleteCascadeUser).Username); - Assert.Equal(group.Users[1].Password, (ret[4] as DeleteCascadeUser).Password); - Assert.IsType(ret[5]); - Assert.Equal(group.Users[2].Id, (ret[5] as DeleteCascadeUser).Id); - Assert.Equal(group.Users[2].Username, (ret[5] as DeleteCascadeUser).Username); - Assert.Equal(group.Users[2].Password, (ret[5] as DeleteCascadeUser).Password); - Assert.IsType(ret[6]); - Assert.Equal(group.Id, (ret[6] as DeleteCascadeUserGroup).Id); - Assert.Equal(group.GroupName, (ret[6] as DeleteCascadeUserGroup).GroupName); - //OneToMany EnableCascadeSave InMemory - fsql.Delete().Where("1=1").ExecuteAffrows(); - fsql.Delete().Where("1=1").ExecuteAffrows(); - fsql.Delete().Where("1=1").ExecuteAffrows(); - group = new DeleteCascadeUserGroup - { - GroupName = "group01", - Users = new List + }; + groupRepo.Insert(group); + Assert.Equal(group.Id, group.Users[0].GroupId); + Assert.Equal(group.Id, group.Users[1].GroupId); + Assert.Equal(group.Id, group.Users[2].GroupId); + ret = groupRepo.DeleteCascadeByDatabase(a => a.Id == group.Id); + Assert.Equal(7, ret.Count); + Assert.IsType(ret[0]); + Assert.Equal(group.Users[0].UserExt.UserId, (ret[0] as DeleteCascadeUserExt).UserId); + Assert.Equal(group.Users[0].UserExt.Remark, (ret[0] as DeleteCascadeUserExt).Remark); + Assert.IsType(ret[1]); + Assert.Equal(group.Users[1].UserExt.UserId, (ret[1] as DeleteCascadeUserExt).UserId); + Assert.Equal(group.Users[1].UserExt.Remark, (ret[1] as DeleteCascadeUserExt).Remark); + Assert.IsType(ret[2]); + Assert.Equal(group.Users[2].UserExt.UserId, (ret[2] as DeleteCascadeUserExt).UserId); + Assert.Equal(group.Users[2].UserExt.Remark, (ret[2] as DeleteCascadeUserExt).Remark); + Assert.IsType(ret[3]); + Assert.Equal(group.Users[0].Id, (ret[3] as DeleteCascadeUser).Id); + Assert.Equal(group.Users[0].Username, (ret[3] as DeleteCascadeUser).Username); + Assert.Equal(group.Users[0].Password, (ret[3] as DeleteCascadeUser).Password); + Assert.IsType(ret[4]); + Assert.Equal(group.Users[1].Id, (ret[4] as DeleteCascadeUser).Id); + Assert.Equal(group.Users[1].Username, (ret[4] as DeleteCascadeUser).Username); + Assert.Equal(group.Users[1].Password, (ret[4] as DeleteCascadeUser).Password); + Assert.IsType(ret[5]); + Assert.Equal(group.Users[2].Id, (ret[5] as DeleteCascadeUser).Id); + Assert.Equal(group.Users[2].Username, (ret[5] as DeleteCascadeUser).Username); + Assert.Equal(group.Users[2].Password, (ret[5] as DeleteCascadeUser).Password); + Assert.IsType(ret[6]); + Assert.Equal(group.Id, (ret[6] as DeleteCascadeUserGroup).Id); + Assert.Equal(group.GroupName, (ret[6] as DeleteCascadeUserGroup).GroupName); + //OneToMany EnableCascadeSave InMemory + fsql.Delete().Where("1=1").ExecuteAffrows(); + fsql.Delete().Where("1=1").ExecuteAffrows(); + fsql.Delete().Where("1=1").ExecuteAffrows(); + group = new DeleteCascadeUserGroup + { + GroupName = "group01", + Users = new List { new DeleteCascadeUser { Username = "admin01", Password = "pwd01", UserExt = new DeleteCascadeUserExt { Remark = "用户备注01" } }, new DeleteCascadeUser { Username = "admin02", Password = "pwd02", UserExt = new DeleteCascadeUserExt { Remark = "用户备注02" } }, new DeleteCascadeUser { Username = "admin03", Password = "pwd03", UserExt = new DeleteCascadeUserExt { Remark = "用户备注03" } }, } - }; - groupRepo.Insert(group); - Assert.Equal(group.Id, group.Users[0].GroupId); - Assert.Equal(group.Id, group.Users[1].GroupId); - Assert.Equal(group.Id, group.Users[2].GroupId); - affrows = groupRepo.Delete(group); - Assert.Equal(7, affrows); - Assert.Equal(0, group.Id); - Assert.Equal("group01", group.GroupName); - Assert.Equal(0, group.Users[0].Id); - Assert.Equal("admin01", group.Users[0].Username); - Assert.Equal("pwd01", group.Users[0].Password); - Assert.True(group.Users[0].UserExt.UserId > 0); - Assert.Equal("用户备注01", group.Users[0].UserExt.Remark); - Assert.Equal(0, group.Users[1].Id); - Assert.Equal("admin02", group.Users[1].Username); - Assert.Equal("pwd02", group.Users[1].Password); - Assert.True(group.Users[1].UserExt.UserId > 0); - Assert.Equal("用户备注02", group.Users[1].UserExt.Remark); - Assert.Equal(0, group.Users[2].Id); - Assert.Equal("admin03", group.Users[2].Username); - Assert.Equal("pwd03", group.Users[2].Password); - Assert.True(group.Users[2].UserExt.UserId > 0); - Assert.Equal("用户备注03", group.Users[2].UserExt.Remark); - Assert.False(groupRepo.Select.Any()); - Assert.False(userRepo.Select.Any()); - Assert.False(userextRepo.Select.Any()); + }; + groupRepo.Insert(group); + Assert.Equal(group.Id, group.Users[0].GroupId); + Assert.Equal(group.Id, group.Users[1].GroupId); + Assert.Equal(group.Id, group.Users[2].GroupId); + affrows = groupRepo.Delete(group); + Assert.Equal(7, affrows); + Assert.Equal(0, group.Id); + Assert.Equal("group01", group.GroupName); + Assert.Equal(0, group.Users[0].Id); + Assert.Equal("admin01", group.Users[0].Username); + Assert.Equal("pwd01", group.Users[0].Password); + Assert.True(group.Users[0].UserExt.UserId > 0); + Assert.Equal("用户备注01", group.Users[0].UserExt.Remark); + Assert.Equal(0, group.Users[1].Id); + Assert.Equal("admin02", group.Users[1].Username); + Assert.Equal("pwd02", group.Users[1].Password); + Assert.True(group.Users[1].UserExt.UserId > 0); + Assert.Equal("用户备注02", group.Users[1].UserExt.Remark); + Assert.Equal(0, group.Users[2].Id); + Assert.Equal("admin03", group.Users[2].Username); + Assert.Equal("pwd03", group.Users[2].Password); + Assert.True(group.Users[2].UserExt.UserId > 0); + Assert.Equal("用户备注03", group.Users[2].UserExt.Remark); + Assert.False(groupRepo.Select.Any()); + Assert.False(userRepo.Select.Any()); + Assert.False(userextRepo.Select.Any()); - //ManyToMany InDatabase - fsql.Delete().Where("1=1").ExecuteAffrows(); - fsql.Delete().Where("1=1").ExecuteAffrows(); - fsql.Delete().Where("1=1").ExecuteAffrows(); - fsql.Delete().Where("1=1").ExecuteAffrows(); - fsql.Delete().Where("1=1").ExecuteAffrows(); - var tags = new[] { + //ManyToMany InDatabase + fsql.Delete().Where("1=1").ExecuteAffrows(); + fsql.Delete().Where("1=1").ExecuteAffrows(); + fsql.Delete().Where("1=1").ExecuteAffrows(); + fsql.Delete().Where("1=1").ExecuteAffrows(); + fsql.Delete().Where("1=1").ExecuteAffrows(); + var tags = new[] { new DeleteCascadeTag { TagName = "tag01" }, new DeleteCascadeTag { TagName = "tag02" }, new DeleteCascadeTag { TagName = "tag03" }, @@ -195,94 +213,94 @@ namespace FreeSql.Tests new DeleteCascadeTag { TagName = "tag07" }, new DeleteCascadeTag { TagName = "tag08" }, }; - tagRepo.Insert(tags); - groupRepo.DbContextOptions.EnableCascadeSave = true; - group = new DeleteCascadeUserGroup - { - GroupName = "group01", - Users = new List + tagRepo.Insert(tags); + groupRepo.DbContextOptions.EnableCascadeSave = true; + group = new DeleteCascadeUserGroup + { + GroupName = "group01", + Users = new List { new DeleteCascadeUser { Username = "admin01", Password = "pwd01", UserExt = new DeleteCascadeUserExt { Remark = "用户备注01" }, Tags = new List { tags[0], tags[2], tags[3], tags[6] } }, new DeleteCascadeUser { Username = "admin02", Password = "pwd02", UserExt = new DeleteCascadeUserExt { Remark = "用户备注02" }, Tags = new List { tags[1], tags[2], tags[5] } }, new DeleteCascadeUser { Username = "admin03", Password = "pwd03", UserExt = new DeleteCascadeUserExt { Remark = "用户备注03" }, Tags = new List { tags[3], tags[4], tags[6], tags[7] } }, } - }; - groupRepo.Insert(group); - Assert.Equal(group.Id, group.Users[0].GroupId); - Assert.Equal(group.Id, group.Users[1].GroupId); - Assert.Equal(group.Id, group.Users[2].GroupId); - ret = groupRepo.DeleteCascadeByDatabase(a => a.Id == group.Id); - Assert.Equal(18, ret.Count); + }; + groupRepo.Insert(group); + Assert.Equal(group.Id, group.Users[0].GroupId); + Assert.Equal(group.Id, group.Users[1].GroupId); + Assert.Equal(group.Id, group.Users[2].GroupId); + ret = groupRepo.DeleteCascadeByDatabase(a => a.Id == group.Id); + Assert.Equal(18, ret.Count); - Assert.IsType(ret[0]); - Assert.Equal(group.Users[0].UserExt.UserId, (ret[0] as DeleteCascadeUserExt).UserId); - Assert.Equal(group.Users[0].UserExt.Remark, (ret[0] as DeleteCascadeUserExt).Remark); - Assert.IsType(ret[1]); - Assert.Equal(group.Users[1].UserExt.UserId, (ret[1] as DeleteCascadeUserExt).UserId); - Assert.Equal(group.Users[1].UserExt.Remark, (ret[1] as DeleteCascadeUserExt).Remark); - Assert.IsType(ret[2]); - Assert.Equal(group.Users[2].UserExt.UserId, (ret[2] as DeleteCascadeUserExt).UserId); - Assert.Equal(group.Users[2].UserExt.Remark, (ret[2] as DeleteCascadeUserExt).Remark); + Assert.IsType(ret[0]); + Assert.Equal(group.Users[0].UserExt.UserId, (ret[0] as DeleteCascadeUserExt).UserId); + Assert.Equal(group.Users[0].UserExt.Remark, (ret[0] as DeleteCascadeUserExt).Remark); + Assert.IsType(ret[1]); + Assert.Equal(group.Users[1].UserExt.UserId, (ret[1] as DeleteCascadeUserExt).UserId); + Assert.Equal(group.Users[1].UserExt.Remark, (ret[1] as DeleteCascadeUserExt).Remark); + Assert.IsType(ret[2]); + Assert.Equal(group.Users[2].UserExt.UserId, (ret[2] as DeleteCascadeUserExt).UserId); + Assert.Equal(group.Users[2].UserExt.Remark, (ret[2] as DeleteCascadeUserExt).Remark); - Assert.IsType(ret[3]); - Assert.Equal(group.Users[0].Id, (ret[3] as DeleteCascadeUserTag).UserId); - Assert.Equal(tags[0].Id, (ret[3] as DeleteCascadeUserTag).TagId); - Assert.IsType(ret[4]); - Assert.Equal(group.Users[0].Id, (ret[4] as DeleteCascadeUserTag).UserId); - Assert.Equal(tags[2].Id, (ret[4] as DeleteCascadeUserTag).TagId); - Assert.IsType(ret[5]); - Assert.Equal(group.Users[0].Id, (ret[5] as DeleteCascadeUserTag).UserId); - Assert.Equal(tags[3].Id, (ret[5] as DeleteCascadeUserTag).TagId); - Assert.IsType(ret[6]); - Assert.Equal(group.Users[0].Id, (ret[6] as DeleteCascadeUserTag).UserId); - Assert.Equal(tags[6].Id, (ret[6] as DeleteCascadeUserTag).TagId); + Assert.IsType(ret[3]); + Assert.Equal(group.Users[0].Id, (ret[3] as DeleteCascadeUserTag).UserId); + Assert.Equal(tags[0].Id, (ret[3] as DeleteCascadeUserTag).TagId); + Assert.IsType(ret[4]); + Assert.Equal(group.Users[0].Id, (ret[4] as DeleteCascadeUserTag).UserId); + Assert.Equal(tags[2].Id, (ret[4] as DeleteCascadeUserTag).TagId); + Assert.IsType(ret[5]); + Assert.Equal(group.Users[0].Id, (ret[5] as DeleteCascadeUserTag).UserId); + Assert.Equal(tags[3].Id, (ret[5] as DeleteCascadeUserTag).TagId); + Assert.IsType(ret[6]); + Assert.Equal(group.Users[0].Id, (ret[6] as DeleteCascadeUserTag).UserId); + Assert.Equal(tags[6].Id, (ret[6] as DeleteCascadeUserTag).TagId); - Assert.IsType(ret[7]); - Assert.Equal(group.Users[1].Id, (ret[7] as DeleteCascadeUserTag).UserId); - Assert.Equal(tags[1].Id, (ret[7] as DeleteCascadeUserTag).TagId); - Assert.IsType(ret[8]); - Assert.Equal(group.Users[1].Id, (ret[8] as DeleteCascadeUserTag).UserId); - Assert.Equal(tags[2].Id, (ret[8] as DeleteCascadeUserTag).TagId); - Assert.IsType(ret[9]); - Assert.Equal(group.Users[1].Id, (ret[9] as DeleteCascadeUserTag).UserId); - Assert.Equal(tags[5].Id, (ret[9] as DeleteCascadeUserTag).TagId); + Assert.IsType(ret[7]); + Assert.Equal(group.Users[1].Id, (ret[7] as DeleteCascadeUserTag).UserId); + Assert.Equal(tags[1].Id, (ret[7] as DeleteCascadeUserTag).TagId); + Assert.IsType(ret[8]); + Assert.Equal(group.Users[1].Id, (ret[8] as DeleteCascadeUserTag).UserId); + Assert.Equal(tags[2].Id, (ret[8] as DeleteCascadeUserTag).TagId); + Assert.IsType(ret[9]); + Assert.Equal(group.Users[1].Id, (ret[9] as DeleteCascadeUserTag).UserId); + Assert.Equal(tags[5].Id, (ret[9] as DeleteCascadeUserTag).TagId); - Assert.IsType(ret[10]); - Assert.Equal(group.Users[2].Id, (ret[10] as DeleteCascadeUserTag).UserId); - Assert.Equal(tags[3].Id, (ret[10] as DeleteCascadeUserTag).TagId); - Assert.IsType(ret[11]); - Assert.Equal(group.Users[2].Id, (ret[11] as DeleteCascadeUserTag).UserId); - Assert.Equal(tags[4].Id, (ret[11] as DeleteCascadeUserTag).TagId); - Assert.IsType(ret[12]); - Assert.Equal(group.Users[2].Id, (ret[12] as DeleteCascadeUserTag).UserId); - Assert.Equal(tags[6].Id, (ret[12] as DeleteCascadeUserTag).TagId); - Assert.IsType(ret[13]); - Assert.Equal(group.Users[2].Id, (ret[13] as DeleteCascadeUserTag).UserId); - Assert.Equal(tags[7].Id, (ret[13] as DeleteCascadeUserTag).TagId); + Assert.IsType(ret[10]); + Assert.Equal(group.Users[2].Id, (ret[10] as DeleteCascadeUserTag).UserId); + Assert.Equal(tags[3].Id, (ret[10] as DeleteCascadeUserTag).TagId); + Assert.IsType(ret[11]); + Assert.Equal(group.Users[2].Id, (ret[11] as DeleteCascadeUserTag).UserId); + Assert.Equal(tags[4].Id, (ret[11] as DeleteCascadeUserTag).TagId); + Assert.IsType(ret[12]); + Assert.Equal(group.Users[2].Id, (ret[12] as DeleteCascadeUserTag).UserId); + Assert.Equal(tags[6].Id, (ret[12] as DeleteCascadeUserTag).TagId); + Assert.IsType(ret[13]); + Assert.Equal(group.Users[2].Id, (ret[13] as DeleteCascadeUserTag).UserId); + Assert.Equal(tags[7].Id, (ret[13] as DeleteCascadeUserTag).TagId); - Assert.IsType(ret[14]); - Assert.Equal(group.Users[0].Id, (ret[14] as DeleteCascadeUser).Id); - Assert.Equal(group.Users[0].Username, (ret[14] as DeleteCascadeUser).Username); - Assert.Equal(group.Users[0].Password, (ret[14] as DeleteCascadeUser).Password); - Assert.IsType(ret[15]); - Assert.Equal(group.Users[1].Id, (ret[15] as DeleteCascadeUser).Id); - Assert.Equal(group.Users[1].Username, (ret[15] as DeleteCascadeUser).Username); - Assert.Equal(group.Users[1].Password, (ret[15] as DeleteCascadeUser).Password); - Assert.IsType(ret[16]); - Assert.Equal(group.Users[2].Id, (ret[16] as DeleteCascadeUser).Id); - Assert.Equal(group.Users[2].Username, (ret[16] as DeleteCascadeUser).Username); - Assert.Equal(group.Users[2].Password, (ret[16] as DeleteCascadeUser).Password); - Assert.IsType(ret[17]); - Assert.Equal(group.Id, (ret[17] as DeleteCascadeUserGroup).Id); - Assert.Equal(group.GroupName, (ret[17] as DeleteCascadeUserGroup).GroupName); + Assert.IsType(ret[14]); + Assert.Equal(group.Users[0].Id, (ret[14] as DeleteCascadeUser).Id); + Assert.Equal(group.Users[0].Username, (ret[14] as DeleteCascadeUser).Username); + Assert.Equal(group.Users[0].Password, (ret[14] as DeleteCascadeUser).Password); + Assert.IsType(ret[15]); + Assert.Equal(group.Users[1].Id, (ret[15] as DeleteCascadeUser).Id); + Assert.Equal(group.Users[1].Username, (ret[15] as DeleteCascadeUser).Username); + Assert.Equal(group.Users[1].Password, (ret[15] as DeleteCascadeUser).Password); + Assert.IsType(ret[16]); + Assert.Equal(group.Users[2].Id, (ret[16] as DeleteCascadeUser).Id); + Assert.Equal(group.Users[2].Username, (ret[16] as DeleteCascadeUser).Username); + Assert.Equal(group.Users[2].Password, (ret[16] as DeleteCascadeUser).Password); + Assert.IsType(ret[17]); + Assert.Equal(group.Id, (ret[17] as DeleteCascadeUserGroup).Id); + Assert.Equal(group.GroupName, (ret[17] as DeleteCascadeUserGroup).GroupName); - //ManyToMany EnableCascadeSave InMemory - fsql.Delete().Where("1=1").ExecuteAffrows(); - fsql.Delete().Where("1=1").ExecuteAffrows(); - fsql.Delete().Where("1=1").ExecuteAffrows(); - fsql.Delete().Where("1=1").ExecuteAffrows(); - fsql.Delete().Where("1=1").ExecuteAffrows(); - tags = new[] { + //ManyToMany EnableCascadeSave InMemory + fsql.Delete().Where("1=1").ExecuteAffrows(); + fsql.Delete().Where("1=1").ExecuteAffrows(); + fsql.Delete().Where("1=1").ExecuteAffrows(); + fsql.Delete().Where("1=1").ExecuteAffrows(); + fsql.Delete().Where("1=1").ExecuteAffrows(); + tags = new[] { new DeleteCascadeTag { TagName = "tag01" }, new DeleteCascadeTag { TagName = "tag02" }, new DeleteCascadeTag { TagName = "tag03" }, @@ -292,45 +310,46 @@ namespace FreeSql.Tests new DeleteCascadeTag { TagName = "tag07" }, new DeleteCascadeTag { TagName = "tag08" }, }; - tagRepo.Insert(tags); - groupRepo.DbContextOptions.EnableCascadeSave = true; - group = new DeleteCascadeUserGroup - { - GroupName = "group01", - Users = new List + tagRepo.Insert(tags); + groupRepo.DbContextOptions.EnableCascadeSave = true; + group = new DeleteCascadeUserGroup + { + GroupName = "group01", + Users = new List { new DeleteCascadeUser { Username = "admin01", Password = "pwd01", UserExt = new DeleteCascadeUserExt { Remark = "用户备注01" }, Tags = new List { tags[0], tags[2], tags[3], tags[6] } }, new DeleteCascadeUser { Username = "admin02", Password = "pwd02", UserExt = new DeleteCascadeUserExt { Remark = "用户备注02" }, Tags = new List { tags[1], tags[2], tags[5] } }, new DeleteCascadeUser { Username = "admin03", Password = "pwd03", UserExt = new DeleteCascadeUserExt { Remark = "用户备注03" }, Tags = new List { tags[3], tags[4], tags[6], tags[7] } }, } - }; - groupRepo.Insert(group); - Assert.Equal(group.Id, group.Users[0].GroupId); - Assert.Equal(group.Id, group.Users[1].GroupId); - Assert.Equal(group.Id, group.Users[2].GroupId); - affrows = groupRepo.Delete(group); - Assert.Equal(18, affrows); - Assert.Equal(0, group.Id); - Assert.Equal("group01", group.GroupName); - Assert.Equal(0, group.Users[0].Id); - Assert.Equal("admin01", group.Users[0].Username); - Assert.Equal("pwd01", group.Users[0].Password); - Assert.True(group.Users[0].UserExt.UserId > 0); - Assert.Equal("用户备注01", group.Users[0].UserExt.Remark); - Assert.Equal(0, group.Users[1].Id); - Assert.Equal("admin02", group.Users[1].Username); - Assert.Equal("pwd02", group.Users[1].Password); - Assert.True(group.Users[1].UserExt.UserId > 0); - Assert.Equal("用户备注02", group.Users[1].UserExt.Remark); - Assert.Equal(0, group.Users[2].Id); - Assert.Equal("admin03", group.Users[2].Username); - Assert.Equal("pwd03", group.Users[2].Password); - Assert.True(group.Users[2].UserExt.UserId > 0); - Assert.Equal("用户备注03", group.Users[2].UserExt.Remark); - Assert.False(groupRepo.Select.Any()); - Assert.False(userRepo.Select.Any()); - Assert.False(userextRepo.Select.Any()); - Assert.False(fsql.Select().Any()); + }; + groupRepo.Insert(group); + Assert.Equal(group.Id, group.Users[0].GroupId); + Assert.Equal(group.Id, group.Users[1].GroupId); + Assert.Equal(group.Id, group.Users[2].GroupId); + affrows = groupRepo.Delete(group); + Assert.Equal(18, affrows); + Assert.Equal(0, group.Id); + Assert.Equal("group01", group.GroupName); + Assert.Equal(0, group.Users[0].Id); + Assert.Equal("admin01", group.Users[0].Username); + Assert.Equal("pwd01", group.Users[0].Password); + Assert.True(group.Users[0].UserExt.UserId > 0); + Assert.Equal("用户备注01", group.Users[0].UserExt.Remark); + Assert.Equal(0, group.Users[1].Id); + Assert.Equal("admin02", group.Users[1].Username); + Assert.Equal("pwd02", group.Users[1].Password); + Assert.True(group.Users[1].UserExt.UserId > 0); + Assert.Equal("用户备注02", group.Users[1].UserExt.Remark); + Assert.Equal(0, group.Users[2].Id); + Assert.Equal("admin03", group.Users[2].Username); + Assert.Equal("pwd03", group.Users[2].Password); + Assert.True(group.Users[2].UserExt.UserId > 0); + Assert.Equal("用户备注03", group.Users[2].UserExt.Remark); + Assert.False(groupRepo.Select.Any()); + Assert.False(userRepo.Select.Any()); + Assert.False(userextRepo.Select.Any()); + Assert.False(fsql.Select().Any()); + } } public class DeleteCascadeUser { @@ -339,6 +358,7 @@ namespace FreeSql.Tests public string Username { get; set; } public string Password { get; set; } public int GroupId { get; set; } + public bool IsDeleted { get; set; } [Navigate(nameof(Id))] public DeleteCascadeUserExt UserExt { get; set; } @@ -350,6 +370,7 @@ namespace FreeSql.Tests [Column(IsPrimary = true)] public int UserId { get; set; } public string Remark { get; set; } + public bool IsDeleted { get; set; } [Navigate(nameof(UserId))] public DeleteCascadeUser User { get; set; } @@ -359,6 +380,7 @@ namespace FreeSql.Tests [Column(IsIdentity = true)] public int Id { get; set; } public string GroupName { get; set; } + public bool IsDeleted { get; set; } [Navigate(nameof(DeleteCascadeUser.GroupId))] public List Users { get; set; } @@ -368,6 +390,7 @@ namespace FreeSql.Tests [Column(IsIdentity = true)] public int Id { get; set; } public string TagName { get; set; } + public bool IsDeleted { get; set; } [Navigate(ManyToMany = typeof(DeleteCascadeUserTag))] public List Users { get; set; } @@ -376,6 +399,7 @@ namespace FreeSql.Tests { public int UserId { get; set; } public int TagId { get; set; } + public bool IsDeleted { get; set; } [Navigate(nameof(UserId))] public DeleteCascadeUser User { get; set; } diff --git a/FreeSql.Tests/FreeSql.Tests/Sqlite/Curd/SqliteUpdateTest.cs b/FreeSql.Tests/FreeSql.Tests/Sqlite/Curd/SqliteUpdateTest.cs index 738852d4..e6a4bbf8 100644 --- a/FreeSql.Tests/FreeSql.Tests/Sqlite/Curd/SqliteUpdateTest.cs +++ b/FreeSql.Tests/FreeSql.Tests/Sqlite/Curd/SqliteUpdateTest.cs @@ -1,4 +1,4 @@ -using FreeSql.DataAnnotations; +using FreeSql.DataAnnotations; using System; using System.Collections.Generic; using System.Linq; @@ -174,6 +174,9 @@ namespace FreeSql.Tests.Sqlite sql = update.Set(a => a.Clicks == null).Where(a => a.Id == 1).ToSql().Replace("\r\n", ""); Assert.Equal("UPDATE \"tb_topic\" SET \"Clicks\" = NULL WHERE (\"Id\" = 1)", sql); + + sql = update.SetIf(false, a => a.Clicks == null).Where(a => a.Id == 1).ToSql()?.Replace("\r\n", ""); + Assert.Null(sql); } [Fact] public void SetRaw() diff --git a/FreeSql/Internal/CommonProvider/DeleteProvider.cs b/FreeSql/Internal/CommonProvider/DeleteProvider.cs index a66709b8..1f5a27df 100644 --- a/FreeSql/Internal/CommonProvider/DeleteProvider.cs +++ b/FreeSql/Internal/CommonProvider/DeleteProvider.cs @@ -177,6 +177,7 @@ namespace FreeSql.Internal.CommonProvider sb.Append(sql).Append("\r\n\r\n;\r\n\r\n"); }); if (sb.Length > 0) sb.Remove(sb.Length - 9, 9); + if (sb.Length == 0) return null; return sb.ToString(); } diff --git a/FreeSql/Internal/CommonProvider/UpdateProvider.cs b/FreeSql/Internal/CommonProvider/UpdateProvider.cs index 2c73f561..d130b9e1 100644 --- a/FreeSql/Internal/CommonProvider/UpdateProvider.cs +++ b/FreeSql/Internal/CommonProvider/UpdateProvider.cs @@ -797,6 +797,7 @@ namespace FreeSql.Internal.CommonProvider sb2.Append(sql).Append("\r\n\r\n;\r\n\r\n"); }); if (sb2.Length > 0) sb2.Remove(sb2.Length - 9, 9); + if (sb2.Length == 0) return null; return sb2.ToString(); } @@ -866,6 +867,7 @@ namespace FreeSql.Internal.CommonProvider public virtual void ToSqlExtension110(StringBuilder sb, bool isAsTableSplited) { if (_where.Length == 0 && _source.Any() == false) return; + if (_source.Any() == false && _set.Length == 0 && _setIncr.Length == 0) return; if (_table.AsTableImpl != null && isAsTableSplited == false && _source == _sourceOld && _source.Any()) { diff --git a/Providers/FreeSql.Provider.ClickHouse/Curd/ClickHouseDelete.cs b/Providers/FreeSql.Provider.ClickHouse/Curd/ClickHouseDelete.cs index 782f2e8e..28211a80 100644 --- a/Providers/FreeSql.Provider.ClickHouse/Curd/ClickHouseDelete.cs +++ b/Providers/FreeSql.Provider.ClickHouse/Curd/ClickHouseDelete.cs @@ -20,7 +20,7 @@ namespace FreeSql.ClickHouse.Curd public override string ToSql() { - return base.ToSql().Replace("DELETE FROM ", "ALTER TABLE ").Replace(" WHERE ", " DELETE WHERE "); + return base.ToSql()?.Replace("DELETE FROM ", "ALTER TABLE ").Replace(" WHERE ", " DELETE WHERE "); } #if net40 diff --git a/Providers/FreeSql.Provider.ClickHouse/Curd/ClickHouseUpdate.cs b/Providers/FreeSql.Provider.ClickHouse/Curd/ClickHouseUpdate.cs index a6d3b527..cdca5e8b 100644 --- a/Providers/FreeSql.Provider.ClickHouse/Curd/ClickHouseUpdate.cs +++ b/Providers/FreeSql.Provider.ClickHouse/Curd/ClickHouseUpdate.cs @@ -68,6 +68,7 @@ namespace FreeSql.ClickHouse.Curd public override void ToSqlExtension110(StringBuilder sb, bool isAsTableSplited) { if (_where.Length == 0 && _source.Any() == false) return; + if (_source.Any() == false && _set.Length == 0 && _setIncr.Length == 0) return; if (_table.AsTableImpl != null && isAsTableSplited == false && _source == _sourceOld && _source.Any()) {