mirror of
				https://github.com/nsnail/FreeSql.git
				synced 2025-11-04 17:20:49 +08:00 
			
		
		
		
	- 增加 FreeSqlBuilder UseNameConvert 方法,类名、属性名都生效;
- 调整 FreeSqlBuilder,准备移除 UseEntityPropertyNameConvert/UseSyncStructureToLower/UseSyncStructureToUpper 方法;#260
This commit is contained in:
		@@ -110,6 +110,13 @@
 | 
				
			|||||||
            清空状态数据
 | 
					            清空状态数据
 | 
				
			||||||
            </summary>
 | 
					            </summary>
 | 
				
			||||||
        </member>
 | 
					        </member>
 | 
				
			||||||
 | 
					        <member name="M:FreeSql.DbSet`1.RemoveAsync(System.Linq.Expressions.Expression{System.Func{`0,System.Boolean}})">
 | 
				
			||||||
 | 
					            <summary>
 | 
				
			||||||
 | 
					            根据 lambda 条件删除数据
 | 
				
			||||||
 | 
					            </summary>
 | 
				
			||||||
 | 
					            <param name="predicate"></param>
 | 
				
			||||||
 | 
					            <returns></returns>
 | 
				
			||||||
 | 
					        </member>
 | 
				
			||||||
        <member name="M:FreeSql.DbSet`1.Add(`0)">
 | 
					        <member name="M:FreeSql.DbSet`1.Add(`0)">
 | 
				
			||||||
            <summary>
 | 
					            <summary>
 | 
				
			||||||
            添加
 | 
					            添加
 | 
				
			||||||
@@ -204,6 +211,15 @@
 | 
				
			|||||||
            </summary>
 | 
					            </summary>
 | 
				
			||||||
            <returns></returns>
 | 
					            <returns></returns>
 | 
				
			||||||
        </member>
 | 
					        </member>
 | 
				
			||||||
 | 
					        <member name="M:FreeSql.FreeSqlRepositoryDependencyInjection.AddFreeRepository(Microsoft.Extensions.DependencyInjection.IServiceCollection,System.Action{FreeSql.FluentDataFilter},System.Reflection.Assembly[])">
 | 
				
			||||||
 | 
					            <summary>
 | 
				
			||||||
 | 
					            批量注入 Repository,可以参考代码自行调整
 | 
				
			||||||
 | 
					            </summary>
 | 
				
			||||||
 | 
					            <param name="services"></param>
 | 
				
			||||||
 | 
					            <param name="globalDataFilter"></param>
 | 
				
			||||||
 | 
					            <param name="assemblies"></param>
 | 
				
			||||||
 | 
					            <returns></returns>
 | 
				
			||||||
 | 
					        </member>
 | 
				
			||||||
        <member name="M:FreeSql.IBaseRepository.AsType(System.Type)">
 | 
					        <member name="M:FreeSql.IBaseRepository.AsType(System.Type)">
 | 
				
			||||||
            <summary>
 | 
					            <summary>
 | 
				
			||||||
            动态Type,在使用 Repository<object> 后使用本方法,指定实体类型
 | 
					            动态Type,在使用 Repository<object> 后使用本方法,指定实体类型
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -44,7 +44,7 @@ public class g
 | 
				
			|||||||
    static Lazy<IFreeSql> pgsqlLazy = new Lazy<IFreeSql>(() => new FreeSql.FreeSqlBuilder()
 | 
					    static Lazy<IFreeSql> pgsqlLazy = new Lazy<IFreeSql>(() => new FreeSql.FreeSqlBuilder()
 | 
				
			||||||
        .UseConnectionString(FreeSql.DataType.PostgreSQL, "Host=192.168.164.10;Port=5432;Username=postgres;Password=123456;Database=tedb;Pooling=true;Maximum Pool Size=10")
 | 
					        .UseConnectionString(FreeSql.DataType.PostgreSQL, "Host=192.168.164.10;Port=5432;Username=postgres;Password=123456;Database=tedb;Pooling=true;Maximum Pool Size=10")
 | 
				
			||||||
        .UseAutoSyncStructure(true)
 | 
					        .UseAutoSyncStructure(true)
 | 
				
			||||||
        .UseSyncStructureToLower(true)
 | 
					        .UseNameConvert(FreeSql.Internal.NameConvertType.ToLower)
 | 
				
			||||||
        .UseLazyLoading(true)
 | 
					        .UseLazyLoading(true)
 | 
				
			||||||
        .UseMonitorCommand(
 | 
					        .UseMonitorCommand(
 | 
				
			||||||
            cmd =>
 | 
					            cmd =>
 | 
				
			||||||
@@ -63,7 +63,7 @@ public class g
 | 
				
			|||||||
        .UseConnectionString(FreeSql.DataType.Oracle, "user id=user1;password=123456;data source=//127.0.0.1:1521/XE;Pooling=true;Max Pool Size=10")
 | 
					        .UseConnectionString(FreeSql.DataType.Oracle, "user id=user1;password=123456;data source=//127.0.0.1:1521/XE;Pooling=true;Max Pool Size=10")
 | 
				
			||||||
        .UseAutoSyncStructure(true)
 | 
					        .UseAutoSyncStructure(true)
 | 
				
			||||||
        .UseLazyLoading(true)
 | 
					        .UseLazyLoading(true)
 | 
				
			||||||
        .UseSyncStructureToUpper(true)
 | 
					        .UseNameConvert(FreeSql.Internal.NameConvertType.ToUpper)
 | 
				
			||||||
        .UseNoneCommandParameter(true)
 | 
					        .UseNoneCommandParameter(true)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        .UseMonitorCommand(
 | 
					        .UseMonitorCommand(
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -270,7 +270,7 @@ namespace FreeSql.Tests.MySqlConnector
 | 
				
			|||||||
                })
 | 
					                })
 | 
				
			||||||
            });
 | 
					            });
 | 
				
			||||||
            var ddd = g.mysql.Select<District>().LeftJoin(d => d.ParentCode == d.Parent.Code).ToTreeList();
 | 
					            var ddd = g.mysql.Select<District>().LeftJoin(d => d.ParentCode == d.Parent.Code).ToTreeList();
 | 
				
			||||||
            Assert.Equal(1, ddd.Count);
 | 
					            Assert.Single(ddd);
 | 
				
			||||||
            Assert.Equal(2, ddd[0].Childs.Count);
 | 
					            Assert.Equal(2, ddd[0].Childs.Count);
 | 
				
			||||||
        }
 | 
					        }
 | 
				
			||||||
        public class District
 | 
					        public class District
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -21,10 +21,10 @@ namespace FreeSql.Tests.MySqlConnector
 | 
				
			|||||||
        {
 | 
					        {
 | 
				
			||||||
            g.mysql.Delete<TestOnDuplicateKeyUpdateInfo>(new[] { 100, 101, 102 }).ExecuteAffrows();
 | 
					            g.mysql.Delete<TestOnDuplicateKeyUpdateInfo>(new[] { 100, 101, 102 }).ExecuteAffrows();
 | 
				
			||||||
            var odku1 = g.mysql.Insert(new TestOnDuplicateKeyUpdateInfo { id = 100, title = "title-100", time = DateTime.Parse("2000-01-01") }).NoneParameter().OnDuplicateKeyUpdate();
 | 
					            var odku1 = g.mysql.Insert(new TestOnDuplicateKeyUpdateInfo { id = 100, title = "title-100", time = DateTime.Parse("2000-01-01") }).NoneParameter().OnDuplicateKeyUpdate();
 | 
				
			||||||
            Assert.Equal(odku1.ToSql(), @"INSERT INTO `TestOnDuplicateKeyUpdateInfo`(`id`, `title`, `time`) VALUES(100, 'title-100', '2000-01-01 00:00:00.000')
 | 
					            Assert.Equal(@"INSERT INTO `TestOnDuplicateKeyUpdateInfo`(`id`, `title`, `time`) VALUES(100, 'title-100', '2000-01-01 00:00:00.000')
 | 
				
			||||||
ON DUPLICATE KEY UPDATE
 | 
					ON DUPLICATE KEY UPDATE
 | 
				
			||||||
`title` = VALUES(`title`), 
 | 
					`title` = VALUES(`title`), 
 | 
				
			||||||
`time` = VALUES(`time`)");
 | 
					`time` = VALUES(`time`)", odku1.ToSql());
 | 
				
			||||||
            Assert.Equal(1, odku1.ExecuteAffrows());
 | 
					            Assert.Equal(1, odku1.ExecuteAffrows());
 | 
				
			||||||
 | 
					
 | 
				
			||||||
            var odku2 = g.mysql.Insert(new[] {
 | 
					            var odku2 = g.mysql.Insert(new[] {
 | 
				
			||||||
@@ -32,10 +32,10 @@ ON DUPLICATE KEY UPDATE
 | 
				
			|||||||
                new TestOnDuplicateKeyUpdateInfo { id = 101, title = "title-101", time = DateTime.Parse("2000-01-01") },
 | 
					                new TestOnDuplicateKeyUpdateInfo { id = 101, title = "title-101", time = DateTime.Parse("2000-01-01") },
 | 
				
			||||||
                new TestOnDuplicateKeyUpdateInfo { id = 102, title = "title-102", time = DateTime.Parse("2000-01-01") }
 | 
					                new TestOnDuplicateKeyUpdateInfo { id = 102, title = "title-102", time = DateTime.Parse("2000-01-01") }
 | 
				
			||||||
            }).NoneParameter().OnDuplicateKeyUpdate();
 | 
					            }).NoneParameter().OnDuplicateKeyUpdate();
 | 
				
			||||||
            Assert.Equal(odku2.ToSql(), @"INSERT INTO `TestOnDuplicateKeyUpdateInfo`(`id`, `title`, `time`) VALUES(100, 'title-100', '2000-01-01 00:00:00.000'), (101, 'title-101', '2000-01-01 00:00:00.000'), (102, 'title-102', '2000-01-01 00:00:00.000')
 | 
					            Assert.Equal(@"INSERT INTO `TestOnDuplicateKeyUpdateInfo`(`id`, `title`, `time`) VALUES(100, 'title-100', '2000-01-01 00:00:00.000'), (101, 'title-101', '2000-01-01 00:00:00.000'), (102, 'title-102', '2000-01-01 00:00:00.000')
 | 
				
			||||||
ON DUPLICATE KEY UPDATE
 | 
					ON DUPLICATE KEY UPDATE
 | 
				
			||||||
`title` = VALUES(`title`), 
 | 
					`title` = VALUES(`title`), 
 | 
				
			||||||
`time` = VALUES(`time`)");
 | 
					`time` = VALUES(`time`)", odku2.ToSql());
 | 
				
			||||||
            odku2.ExecuteAffrows();
 | 
					            odku2.ExecuteAffrows();
 | 
				
			||||||
        }
 | 
					        }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@@ -44,10 +44,10 @@ ON DUPLICATE KEY UPDATE
 | 
				
			|||||||
        {
 | 
					        {
 | 
				
			||||||
            g.mysql.Delete<TestOnDuplicateKeyUpdateInfo>(new[] { 200, 201, 202 }).ExecuteAffrows();
 | 
					            g.mysql.Delete<TestOnDuplicateKeyUpdateInfo>(new[] { 200, 201, 202 }).ExecuteAffrows();
 | 
				
			||||||
            var odku1 = g.mysql.Insert(new TestOnDuplicateKeyUpdateInfo { id = 200, title = "title-200", time = DateTime.Parse("2000-01-01") }).IgnoreColumns(a => a.time).NoneParameter().OnDuplicateKeyUpdate();
 | 
					            var odku1 = g.mysql.Insert(new TestOnDuplicateKeyUpdateInfo { id = 200, title = "title-200", time = DateTime.Parse("2000-01-01") }).IgnoreColumns(a => a.time).NoneParameter().OnDuplicateKeyUpdate();
 | 
				
			||||||
            Assert.Equal(odku1.ToSql(), @"INSERT INTO `TestOnDuplicateKeyUpdateInfo`(`id`, `title`) VALUES(200, 'title-200')
 | 
					            Assert.Equal(@"INSERT INTO `TestOnDuplicateKeyUpdateInfo`(`id`, `title`) VALUES(200, 'title-200')
 | 
				
			||||||
ON DUPLICATE KEY UPDATE
 | 
					ON DUPLICATE KEY UPDATE
 | 
				
			||||||
`title` = VALUES(`title`), 
 | 
					`title` = VALUES(`title`), 
 | 
				
			||||||
`time` = '2000-01-01 00:00:00.000'");
 | 
					`time` = '2000-01-01 00:00:00.000'", odku1.ToSql());
 | 
				
			||||||
            Assert.Equal(1, odku1.ExecuteAffrows());
 | 
					            Assert.Equal(1, odku1.ExecuteAffrows());
 | 
				
			||||||
 | 
					
 | 
				
			||||||
            var odku2 = g.mysql.Insert(new[] {
 | 
					            var odku2 = g.mysql.Insert(new[] {
 | 
				
			||||||
@@ -55,21 +55,21 @@ ON DUPLICATE KEY UPDATE
 | 
				
			|||||||
                new TestOnDuplicateKeyUpdateInfo { id = 201, title = "title-201", time = DateTime.Parse("2000-01-01") },
 | 
					                new TestOnDuplicateKeyUpdateInfo { id = 201, title = "title-201", time = DateTime.Parse("2000-01-01") },
 | 
				
			||||||
                new TestOnDuplicateKeyUpdateInfo { id = 202, title = "title-202", time = DateTime.Parse("2000-01-01") }
 | 
					                new TestOnDuplicateKeyUpdateInfo { id = 202, title = "title-202", time = DateTime.Parse("2000-01-01") }
 | 
				
			||||||
            }).IgnoreColumns(a => a.time).NoneParameter().OnDuplicateKeyUpdate();
 | 
					            }).IgnoreColumns(a => a.time).NoneParameter().OnDuplicateKeyUpdate();
 | 
				
			||||||
            Assert.Equal(odku2.ToSql(), @"INSERT INTO `TestOnDuplicateKeyUpdateInfo`(`id`, `title`) VALUES(200, 'title-200'), (201, 'title-201'), (202, 'title-202')
 | 
					            Assert.Equal(@"INSERT INTO `TestOnDuplicateKeyUpdateInfo`(`id`, `title`) VALUES(200, 'title-200'), (201, 'title-201'), (202, 'title-202')
 | 
				
			||||||
ON DUPLICATE KEY UPDATE
 | 
					ON DUPLICATE KEY UPDATE
 | 
				
			||||||
`title` = VALUES(`title`), 
 | 
					`title` = VALUES(`title`), 
 | 
				
			||||||
`time` = CASE `id` 
 | 
					`time` = CASE `id` 
 | 
				
			||||||
WHEN 200 THEN '2000-01-01 00:00:00.000' 
 | 
					WHEN 200 THEN '2000-01-01 00:00:00.000' 
 | 
				
			||||||
WHEN 201 THEN '2000-01-01 00:00:00.000' 
 | 
					WHEN 201 THEN '2000-01-01 00:00:00.000' 
 | 
				
			||||||
WHEN 202 THEN '2000-01-01 00:00:00.000' END");
 | 
					WHEN 202 THEN '2000-01-01 00:00:00.000' END", odku2.ToSql());
 | 
				
			||||||
            odku2.ExecuteAffrows();
 | 
					            odku2.ExecuteAffrows();
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
            g.mysql.Delete<TestOnDuplicateKeyUpdateInfo>(new[] { 200, 201, 202 }).ExecuteAffrows();
 | 
					            g.mysql.Delete<TestOnDuplicateKeyUpdateInfo>(new[] { 200, 201, 202 }).ExecuteAffrows();
 | 
				
			||||||
            odku1 = g.mysql.Insert(new TestOnDuplicateKeyUpdateInfo { id = 200, title = "title-200", time = DateTime.Parse("2000-01-01") }).IgnoreColumns(a => a.time).NoneParameter().OnDuplicateKeyUpdate().IgnoreColumns(a => a.title);
 | 
					            odku1 = g.mysql.Insert(new TestOnDuplicateKeyUpdateInfo { id = 200, title = "title-200", time = DateTime.Parse("2000-01-01") }).IgnoreColumns(a => a.time).NoneParameter().OnDuplicateKeyUpdate().IgnoreColumns(a => a.title);
 | 
				
			||||||
            Assert.Equal(odku1.ToSql(), @"INSERT INTO `TestOnDuplicateKeyUpdateInfo`(`id`, `title`) VALUES(200, 'title-200')
 | 
					            Assert.Equal(@"INSERT INTO `TestOnDuplicateKeyUpdateInfo`(`id`, `title`) VALUES(200, 'title-200')
 | 
				
			||||||
ON DUPLICATE KEY UPDATE
 | 
					ON DUPLICATE KEY UPDATE
 | 
				
			||||||
`time` = '2000-01-01 00:00:00.000'");
 | 
					`time` = '2000-01-01 00:00:00.000'", odku1.ToSql());
 | 
				
			||||||
            Assert.Equal(1, odku1.ExecuteAffrows());
 | 
					            Assert.Equal(1, odku1.ExecuteAffrows());
 | 
				
			||||||
 | 
					
 | 
				
			||||||
            odku2 = g.mysql.Insert(new[] {
 | 
					            odku2 = g.mysql.Insert(new[] {
 | 
				
			||||||
@@ -77,12 +77,12 @@ ON DUPLICATE KEY UPDATE
 | 
				
			|||||||
                new TestOnDuplicateKeyUpdateInfo { id = 201, title = "title-201", time = DateTime.Parse("2000-01-01") },
 | 
					                new TestOnDuplicateKeyUpdateInfo { id = 201, title = "title-201", time = DateTime.Parse("2000-01-01") },
 | 
				
			||||||
                new TestOnDuplicateKeyUpdateInfo { id = 202, title = "title-202", time = DateTime.Parse("2000-01-01") }
 | 
					                new TestOnDuplicateKeyUpdateInfo { id = 202, title = "title-202", time = DateTime.Parse("2000-01-01") }
 | 
				
			||||||
            }).IgnoreColumns(a => a.time).NoneParameter().OnDuplicateKeyUpdate().IgnoreColumns(a => a.title);
 | 
					            }).IgnoreColumns(a => a.time).NoneParameter().OnDuplicateKeyUpdate().IgnoreColumns(a => a.title);
 | 
				
			||||||
            Assert.Equal(odku2.ToSql(), @"INSERT INTO `TestOnDuplicateKeyUpdateInfo`(`id`, `title`) VALUES(200, 'title-200'), (201, 'title-201'), (202, 'title-202')
 | 
					            Assert.Equal(@"INSERT INTO `TestOnDuplicateKeyUpdateInfo`(`id`, `title`) VALUES(200, 'title-200'), (201, 'title-201'), (202, 'title-202')
 | 
				
			||||||
ON DUPLICATE KEY UPDATE
 | 
					ON DUPLICATE KEY UPDATE
 | 
				
			||||||
`time` = CASE `id` 
 | 
					`time` = CASE `id` 
 | 
				
			||||||
WHEN 200 THEN '2000-01-01 00:00:00.000' 
 | 
					WHEN 200 THEN '2000-01-01 00:00:00.000' 
 | 
				
			||||||
WHEN 201 THEN '2000-01-01 00:00:00.000' 
 | 
					WHEN 201 THEN '2000-01-01 00:00:00.000' 
 | 
				
			||||||
WHEN 202 THEN '2000-01-01 00:00:00.000' END");
 | 
					WHEN 202 THEN '2000-01-01 00:00:00.000' END", odku2.ToSql());
 | 
				
			||||||
            odku2.ExecuteAffrows();
 | 
					            odku2.ExecuteAffrows();
 | 
				
			||||||
        }
 | 
					        }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@@ -91,10 +91,10 @@ WHEN 202 THEN '2000-01-01 00:00:00.000' END");
 | 
				
			|||||||
        {
 | 
					        {
 | 
				
			||||||
            g.mysql.Delete<TestOnDuplicateKeyUpdateInfo>(new[] { 300, 301, 302 }).ExecuteAffrows();
 | 
					            g.mysql.Delete<TestOnDuplicateKeyUpdateInfo>(new[] { 300, 301, 302 }).ExecuteAffrows();
 | 
				
			||||||
            var odku1 = g.mysql.Insert(new TestOnDuplicateKeyUpdateInfo { id = 300, title = "title-300", time = DateTime.Parse("2000-01-01") }).InsertColumns(a => a.title).NoneParameter().OnDuplicateKeyUpdate();
 | 
					            var odku1 = g.mysql.Insert(new TestOnDuplicateKeyUpdateInfo { id = 300, title = "title-300", time = DateTime.Parse("2000-01-01") }).InsertColumns(a => a.title).NoneParameter().OnDuplicateKeyUpdate();
 | 
				
			||||||
            Assert.Equal(odku1.ToSql(), @"INSERT INTO `TestOnDuplicateKeyUpdateInfo`(`id`, `title`) VALUES(300, 'title-300')
 | 
					            Assert.Equal(@"INSERT INTO `TestOnDuplicateKeyUpdateInfo`(`id`, `title`) VALUES(300, 'title-300')
 | 
				
			||||||
ON DUPLICATE KEY UPDATE
 | 
					ON DUPLICATE KEY UPDATE
 | 
				
			||||||
`title` = VALUES(`title`), 
 | 
					`title` = VALUES(`title`), 
 | 
				
			||||||
`time` = '2000-01-01 00:00:00.000'");
 | 
					`time` = '2000-01-01 00:00:00.000'", odku1.ToSql());
 | 
				
			||||||
            Assert.Equal(1, odku1.ExecuteAffrows());
 | 
					            Assert.Equal(1, odku1.ExecuteAffrows());
 | 
				
			||||||
 | 
					
 | 
				
			||||||
            var odku2 = g.mysql.Insert(new[] {
 | 
					            var odku2 = g.mysql.Insert(new[] {
 | 
				
			||||||
@@ -102,21 +102,21 @@ ON DUPLICATE KEY UPDATE
 | 
				
			|||||||
                new TestOnDuplicateKeyUpdateInfo { id = 301, title = "title-301", time = DateTime.Parse("2000-01-01") },
 | 
					                new TestOnDuplicateKeyUpdateInfo { id = 301, title = "title-301", time = DateTime.Parse("2000-01-01") },
 | 
				
			||||||
                new TestOnDuplicateKeyUpdateInfo { id = 302, title = "title-302", time = DateTime.Parse("2000-01-01") }
 | 
					                new TestOnDuplicateKeyUpdateInfo { id = 302, title = "title-302", time = DateTime.Parse("2000-01-01") }
 | 
				
			||||||
            }).InsertColumns(a => a.title).NoneParameter().OnDuplicateKeyUpdate();
 | 
					            }).InsertColumns(a => a.title).NoneParameter().OnDuplicateKeyUpdate();
 | 
				
			||||||
            Assert.Equal(odku2.ToSql(), @"INSERT INTO `TestOnDuplicateKeyUpdateInfo`(`id`, `title`) VALUES(300, 'title-300'), (301, 'title-301'), (302, 'title-302')
 | 
					            Assert.Equal(@"INSERT INTO `TestOnDuplicateKeyUpdateInfo`(`id`, `title`) VALUES(300, 'title-300'), (301, 'title-301'), (302, 'title-302')
 | 
				
			||||||
ON DUPLICATE KEY UPDATE
 | 
					ON DUPLICATE KEY UPDATE
 | 
				
			||||||
`title` = VALUES(`title`), 
 | 
					`title` = VALUES(`title`), 
 | 
				
			||||||
`time` = CASE `id` 
 | 
					`time` = CASE `id` 
 | 
				
			||||||
WHEN 300 THEN '2000-01-01 00:00:00.000' 
 | 
					WHEN 300 THEN '2000-01-01 00:00:00.000' 
 | 
				
			||||||
WHEN 301 THEN '2000-01-01 00:00:00.000' 
 | 
					WHEN 301 THEN '2000-01-01 00:00:00.000' 
 | 
				
			||||||
WHEN 302 THEN '2000-01-01 00:00:00.000' END");
 | 
					WHEN 302 THEN '2000-01-01 00:00:00.000' END", odku2.ToSql());
 | 
				
			||||||
            odku2.ExecuteAffrows();
 | 
					            odku2.ExecuteAffrows();
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
            g.mysql.Delete<TestOnDuplicateKeyUpdateInfo>(new[] { 300, 301, 302 }).ExecuteAffrows();
 | 
					            g.mysql.Delete<TestOnDuplicateKeyUpdateInfo>(new[] { 300, 301, 302 }).ExecuteAffrows();
 | 
				
			||||||
            odku1 = g.mysql.Insert(new TestOnDuplicateKeyUpdateInfo { id = 300, title = "title-300", time = DateTime.Parse("2000-01-01") }).InsertColumns(a => a.title).NoneParameter().OnDuplicateKeyUpdate().UpdateColumns(a => a.time);
 | 
					            odku1 = g.mysql.Insert(new TestOnDuplicateKeyUpdateInfo { id = 300, title = "title-300", time = DateTime.Parse("2000-01-01") }).InsertColumns(a => a.title).NoneParameter().OnDuplicateKeyUpdate().UpdateColumns(a => a.time);
 | 
				
			||||||
            Assert.Equal(odku1.ToSql(), @"INSERT INTO `TestOnDuplicateKeyUpdateInfo`(`id`, `title`) VALUES(300, 'title-300')
 | 
					            Assert.Equal(@"INSERT INTO `TestOnDuplicateKeyUpdateInfo`(`id`, `title`) VALUES(300, 'title-300')
 | 
				
			||||||
ON DUPLICATE KEY UPDATE
 | 
					ON DUPLICATE KEY UPDATE
 | 
				
			||||||
`time` = '2000-01-01 00:00:00.000'");
 | 
					`time` = '2000-01-01 00:00:00.000'", odku1.ToSql());
 | 
				
			||||||
            Assert.Equal(1, odku1.ExecuteAffrows());
 | 
					            Assert.Equal(1, odku1.ExecuteAffrows());
 | 
				
			||||||
 | 
					
 | 
				
			||||||
            odku2 = g.mysql.Insert(new[] {
 | 
					            odku2 = g.mysql.Insert(new[] {
 | 
				
			||||||
@@ -124,12 +124,12 @@ ON DUPLICATE KEY UPDATE
 | 
				
			|||||||
                new TestOnDuplicateKeyUpdateInfo { id = 301, title = "title-301", time = DateTime.Parse("2000-01-01") },
 | 
					                new TestOnDuplicateKeyUpdateInfo { id = 301, title = "title-301", time = DateTime.Parse("2000-01-01") },
 | 
				
			||||||
                new TestOnDuplicateKeyUpdateInfo { id = 302, title = "title-302", time = DateTime.Parse("2000-01-01") }
 | 
					                new TestOnDuplicateKeyUpdateInfo { id = 302, title = "title-302", time = DateTime.Parse("2000-01-01") }
 | 
				
			||||||
            }).InsertColumns(a => a.title).NoneParameter().OnDuplicateKeyUpdate().UpdateColumns(a => a.time);
 | 
					            }).InsertColumns(a => a.title).NoneParameter().OnDuplicateKeyUpdate().UpdateColumns(a => a.time);
 | 
				
			||||||
            Assert.Equal(odku2.ToSql(), @"INSERT INTO `TestOnDuplicateKeyUpdateInfo`(`id`, `title`) VALUES(300, 'title-300'), (301, 'title-301'), (302, 'title-302')
 | 
					            Assert.Equal(@"INSERT INTO `TestOnDuplicateKeyUpdateInfo`(`id`, `title`) VALUES(300, 'title-300'), (301, 'title-301'), (302, 'title-302')
 | 
				
			||||||
ON DUPLICATE KEY UPDATE
 | 
					ON DUPLICATE KEY UPDATE
 | 
				
			||||||
`time` = CASE `id` 
 | 
					`time` = CASE `id` 
 | 
				
			||||||
WHEN 300 THEN '2000-01-01 00:00:00.000' 
 | 
					WHEN 300 THEN '2000-01-01 00:00:00.000' 
 | 
				
			||||||
WHEN 301 THEN '2000-01-01 00:00:00.000' 
 | 
					WHEN 301 THEN '2000-01-01 00:00:00.000' 
 | 
				
			||||||
WHEN 302 THEN '2000-01-01 00:00:00.000' END");
 | 
					WHEN 302 THEN '2000-01-01 00:00:00.000' END", odku2.ToSql());
 | 
				
			||||||
            odku2.ExecuteAffrows();
 | 
					            odku2.ExecuteAffrows();
 | 
				
			||||||
        }
 | 
					        }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@@ -138,9 +138,9 @@ WHEN 302 THEN '2000-01-01 00:00:00.000' END");
 | 
				
			|||||||
        {
 | 
					        {
 | 
				
			||||||
            g.mysql.Delete<TestOnDuplicateKeyUpdateInfo>(new[] { 400, 401, 402 }).ExecuteAffrows();
 | 
					            g.mysql.Delete<TestOnDuplicateKeyUpdateInfo>(new[] { 400, 401, 402 }).ExecuteAffrows();
 | 
				
			||||||
            var odku1 = g.mysql.Insert(new TestOnDuplicateKeyUpdateInfo { id = 400, title = "title-400", time = DateTime.Parse("2000-01-01") }).NoneParameter().OnDuplicateKeyUpdate().Set(a => a.time, DateTime.Parse("2020-1-1"));
 | 
					            var odku1 = g.mysql.Insert(new TestOnDuplicateKeyUpdateInfo { id = 400, title = "title-400", time = DateTime.Parse("2000-01-01") }).NoneParameter().OnDuplicateKeyUpdate().Set(a => a.time, DateTime.Parse("2020-1-1"));
 | 
				
			||||||
            Assert.Equal(odku1.ToSql(), @"INSERT INTO `TestOnDuplicateKeyUpdateInfo`(`id`, `title`, `time`) VALUES(400, 'title-400', '2000-01-01 00:00:00.000')
 | 
					            Assert.Equal(@"INSERT INTO `TestOnDuplicateKeyUpdateInfo`(`id`, `title`, `time`) VALUES(400, 'title-400', '2000-01-01 00:00:00.000')
 | 
				
			||||||
ON DUPLICATE KEY UPDATE
 | 
					ON DUPLICATE KEY UPDATE
 | 
				
			||||||
`time` = '2020-01-01 00:00:00.000'");
 | 
					`time` = '2020-01-01 00:00:00.000'", odku1.ToSql());
 | 
				
			||||||
            Assert.Equal(1, odku1.ExecuteAffrows());
 | 
					            Assert.Equal(1, odku1.ExecuteAffrows());
 | 
				
			||||||
 | 
					
 | 
				
			||||||
            var odku2 = g.mysql.Insert(new[] {
 | 
					            var odku2 = g.mysql.Insert(new[] {
 | 
				
			||||||
@@ -148,18 +148,18 @@ ON DUPLICATE KEY UPDATE
 | 
				
			|||||||
                new TestOnDuplicateKeyUpdateInfo { id = 401, title = "title-401", time = DateTime.Parse("2000-01-01") },
 | 
					                new TestOnDuplicateKeyUpdateInfo { id = 401, title = "title-401", time = DateTime.Parse("2000-01-01") },
 | 
				
			||||||
                new TestOnDuplicateKeyUpdateInfo { id = 402, title = "title-402", time = DateTime.Parse("2000-01-01") }
 | 
					                new TestOnDuplicateKeyUpdateInfo { id = 402, title = "title-402", time = DateTime.Parse("2000-01-01") }
 | 
				
			||||||
            }).NoneParameter().OnDuplicateKeyUpdate().Set(a => a.time, DateTime.Parse("2020-1-1"));
 | 
					            }).NoneParameter().OnDuplicateKeyUpdate().Set(a => a.time, DateTime.Parse("2020-1-1"));
 | 
				
			||||||
            Assert.Equal(odku2.ToSql(), @"INSERT INTO `TestOnDuplicateKeyUpdateInfo`(`id`, `title`, `time`) VALUES(400, 'title-400', '2000-01-01 00:00:00.000'), (401, 'title-401', '2000-01-01 00:00:00.000'), (402, 'title-402', '2000-01-01 00:00:00.000')
 | 
					            Assert.Equal(@"INSERT INTO `TestOnDuplicateKeyUpdateInfo`(`id`, `title`, `time`) VALUES(400, 'title-400', '2000-01-01 00:00:00.000'), (401, 'title-401', '2000-01-01 00:00:00.000'), (402, 'title-402', '2000-01-01 00:00:00.000')
 | 
				
			||||||
ON DUPLICATE KEY UPDATE
 | 
					ON DUPLICATE KEY UPDATE
 | 
				
			||||||
`time` = '2020-01-01 00:00:00.000'");
 | 
					`time` = '2020-01-01 00:00:00.000'", odku2.ToSql());
 | 
				
			||||||
            odku2.ExecuteAffrows();
 | 
					            odku2.ExecuteAffrows();
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
            var dt2020 = DateTime.Parse("2020-1-1");
 | 
					            var dt2020 = DateTime.Parse("2020-1-1");
 | 
				
			||||||
            g.mysql.Delete<TestOnDuplicateKeyUpdateInfo>(new[] { 400, 401, 402 }).ExecuteAffrows();
 | 
					            g.mysql.Delete<TestOnDuplicateKeyUpdateInfo>(new[] { 400, 401, 402 }).ExecuteAffrows();
 | 
				
			||||||
            odku1 = g.mysql.Insert(new TestOnDuplicateKeyUpdateInfo { id = 400, title = "title-400", time = DateTime.Parse("2000-01-01") }).NoneParameter().OnDuplicateKeyUpdate().Set(a => a.time == dt2020);
 | 
					            odku1 = g.mysql.Insert(new TestOnDuplicateKeyUpdateInfo { id = 400, title = "title-400", time = DateTime.Parse("2000-01-01") }).NoneParameter().OnDuplicateKeyUpdate().Set(a => a.time == dt2020);
 | 
				
			||||||
            Assert.Equal(odku1.ToSql(), @"INSERT INTO `TestOnDuplicateKeyUpdateInfo`(`id`, `title`, `time`) VALUES(400, 'title-400', '2000-01-01 00:00:00.000')
 | 
					            Assert.Equal(@"INSERT INTO `TestOnDuplicateKeyUpdateInfo`(`id`, `title`, `time`) VALUES(400, 'title-400', '2000-01-01 00:00:00.000')
 | 
				
			||||||
ON DUPLICATE KEY UPDATE
 | 
					ON DUPLICATE KEY UPDATE
 | 
				
			||||||
`time` = '2020-01-01 00:00:00.000'");
 | 
					`time` = '2020-01-01 00:00:00.000'", odku1.ToSql());
 | 
				
			||||||
            Assert.Equal(1, odku1.ExecuteAffrows());
 | 
					            Assert.Equal(1, odku1.ExecuteAffrows());
 | 
				
			||||||
 | 
					
 | 
				
			||||||
            odku2 = g.mysql.Insert(new[] {
 | 
					            odku2 = g.mysql.Insert(new[] {
 | 
				
			||||||
@@ -167,17 +167,17 @@ ON DUPLICATE KEY UPDATE
 | 
				
			|||||||
                new TestOnDuplicateKeyUpdateInfo { id = 401, title = "title-401", time = DateTime.Parse("2000-01-01") },
 | 
					                new TestOnDuplicateKeyUpdateInfo { id = 401, title = "title-401", time = DateTime.Parse("2000-01-01") },
 | 
				
			||||||
                new TestOnDuplicateKeyUpdateInfo { id = 402, title = "title-402", time = DateTime.Parse("2000-01-01") }
 | 
					                new TestOnDuplicateKeyUpdateInfo { id = 402, title = "title-402", time = DateTime.Parse("2000-01-01") }
 | 
				
			||||||
            }).NoneParameter().OnDuplicateKeyUpdate().Set(a => a.time == dt2020);
 | 
					            }).NoneParameter().OnDuplicateKeyUpdate().Set(a => a.time == dt2020);
 | 
				
			||||||
            Assert.Equal(odku2.ToSql(), @"INSERT INTO `TestOnDuplicateKeyUpdateInfo`(`id`, `title`, `time`) VALUES(400, 'title-400', '2000-01-01 00:00:00.000'), (401, 'title-401', '2000-01-01 00:00:00.000'), (402, 'title-402', '2000-01-01 00:00:00.000')
 | 
					            Assert.Equal(@"INSERT INTO `TestOnDuplicateKeyUpdateInfo`(`id`, `title`, `time`) VALUES(400, 'title-400', '2000-01-01 00:00:00.000'), (401, 'title-401', '2000-01-01 00:00:00.000'), (402, 'title-402', '2000-01-01 00:00:00.000')
 | 
				
			||||||
ON DUPLICATE KEY UPDATE
 | 
					ON DUPLICATE KEY UPDATE
 | 
				
			||||||
`time` = '2020-01-01 00:00:00.000'");
 | 
					`time` = '2020-01-01 00:00:00.000'", odku2.ToSql());
 | 
				
			||||||
            odku2.ExecuteAffrows();
 | 
					            odku2.ExecuteAffrows();
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
            g.mysql.Delete<TestOnDuplicateKeyUpdateInfo>(new[] { 400, 401, 402 }).ExecuteAffrows();
 | 
					            g.mysql.Delete<TestOnDuplicateKeyUpdateInfo>(new[] { 400, 401, 402 }).ExecuteAffrows();
 | 
				
			||||||
            odku1 = g.mysql.Insert(new TestOnDuplicateKeyUpdateInfo { id = 400, title = "title-400", time = DateTime.Parse("2000-01-01") }).NoneParameter().OnDuplicateKeyUpdate().Set(a => new { time = dt2020, title = a.title + "123" });
 | 
					            odku1 = g.mysql.Insert(new TestOnDuplicateKeyUpdateInfo { id = 400, title = "title-400", time = DateTime.Parse("2000-01-01") }).NoneParameter().OnDuplicateKeyUpdate().Set(a => new { time = dt2020, title = a.title + "123" });
 | 
				
			||||||
            Assert.Equal(odku1.ToSql(), @"INSERT INTO `TestOnDuplicateKeyUpdateInfo`(`id`, `title`, `time`) VALUES(400, 'title-400', '2000-01-01 00:00:00.000')
 | 
					            Assert.Equal(@"INSERT INTO `TestOnDuplicateKeyUpdateInfo`(`id`, `title`, `time`) VALUES(400, 'title-400', '2000-01-01 00:00:00.000')
 | 
				
			||||||
ON DUPLICATE KEY UPDATE
 | 
					ON DUPLICATE KEY UPDATE
 | 
				
			||||||
`time` = '2020-01-01 00:00:00.000', `title` = concat(`title`, '123')");
 | 
					`time` = '2020-01-01 00:00:00.000', `title` = concat(`title`, '123')", odku1.ToSql());
 | 
				
			||||||
            Assert.Equal(1, odku1.ExecuteAffrows());
 | 
					            Assert.Equal(1, odku1.ExecuteAffrows());
 | 
				
			||||||
 | 
					
 | 
				
			||||||
            odku2 = g.mysql.Insert(new[] {
 | 
					            odku2 = g.mysql.Insert(new[] {
 | 
				
			||||||
@@ -185,9 +185,9 @@ ON DUPLICATE KEY UPDATE
 | 
				
			|||||||
                new TestOnDuplicateKeyUpdateInfo { id = 401, title = "title-401", time = DateTime.Parse("2000-01-01") },
 | 
					                new TestOnDuplicateKeyUpdateInfo { id = 401, title = "title-401", time = DateTime.Parse("2000-01-01") },
 | 
				
			||||||
                new TestOnDuplicateKeyUpdateInfo { id = 402, title = "title-402", time = DateTime.Parse("2000-01-01") }
 | 
					                new TestOnDuplicateKeyUpdateInfo { id = 402, title = "title-402", time = DateTime.Parse("2000-01-01") }
 | 
				
			||||||
            }).NoneParameter().OnDuplicateKeyUpdate().Set(a => new { time = dt2020, title = a.title + "123" });
 | 
					            }).NoneParameter().OnDuplicateKeyUpdate().Set(a => new { time = dt2020, title = a.title + "123" });
 | 
				
			||||||
            Assert.Equal(odku2.ToSql(), @"INSERT INTO `TestOnDuplicateKeyUpdateInfo`(`id`, `title`, `time`) VALUES(400, 'title-400', '2000-01-01 00:00:00.000'), (401, 'title-401', '2000-01-01 00:00:00.000'), (402, 'title-402', '2000-01-01 00:00:00.000')
 | 
					            Assert.Equal(@"INSERT INTO `TestOnDuplicateKeyUpdateInfo`(`id`, `title`, `time`) VALUES(400, 'title-400', '2000-01-01 00:00:00.000'), (401, 'title-401', '2000-01-01 00:00:00.000'), (402, 'title-402', '2000-01-01 00:00:00.000')
 | 
				
			||||||
ON DUPLICATE KEY UPDATE
 | 
					ON DUPLICATE KEY UPDATE
 | 
				
			||||||
`time` = '2020-01-01 00:00:00.000', `title` = concat(`title`, '123')");
 | 
					`time` = '2020-01-01 00:00:00.000', `title` = concat(`title`, '123')", odku2.ToSql());
 | 
				
			||||||
            odku2.ExecuteAffrows();
 | 
					            odku2.ExecuteAffrows();
 | 
				
			||||||
        }
 | 
					        }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -211,7 +211,7 @@ namespace FreeSql.Tests.Odbc.Dameng
 | 
				
			|||||||
                })
 | 
					                })
 | 
				
			||||||
            });
 | 
					            });
 | 
				
			||||||
            var ddd = g.dameng.Select<District>().LeftJoin(d => d.ParentCode == d.Parent.Code).ToTreeList();
 | 
					            var ddd = g.dameng.Select<District>().LeftJoin(d => d.ParentCode == d.Parent.Code).ToTreeList();
 | 
				
			||||||
            Assert.Equal(1, ddd.Count);
 | 
					            Assert.Single(ddd);
 | 
				
			||||||
            Assert.Equal(2, ddd[0].Childs.Count);
 | 
					            Assert.Equal(2, ddd[0].Childs.Count);
 | 
				
			||||||
        }
 | 
					        }
 | 
				
			||||||
        public class District
 | 
					        public class District
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -202,7 +202,7 @@ namespace FreeSql.Tests.Odbc.Default
 | 
				
			|||||||
                })
 | 
					                })
 | 
				
			||||||
            });
 | 
					            });
 | 
				
			||||||
            var ddd = g.odbc.Select<District>().LeftJoin(d => d.ParentCode == d.Parent.Code).ToTreeList();
 | 
					            var ddd = g.odbc.Select<District>().LeftJoin(d => d.ParentCode == d.Parent.Code).ToTreeList();
 | 
				
			||||||
            Assert.Equal(1, ddd.Count);
 | 
					            Assert.Single(ddd);
 | 
				
			||||||
            Assert.Equal(2, ddd[0].Childs.Count);
 | 
					            Assert.Equal(2, ddd[0].Childs.Count);
 | 
				
			||||||
        }
 | 
					        }
 | 
				
			||||||
        public class District
 | 
					        public class District
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -311,7 +311,7 @@ namespace FreeSql.Tests.Odbc.MySql
 | 
				
			|||||||
                })
 | 
					                })
 | 
				
			||||||
            });
 | 
					            });
 | 
				
			||||||
            var ddd = g.mysql.Select<District>().LeftJoin(d => d.ParentCode == d.Parent.Code).ToTreeList();
 | 
					            var ddd = g.mysql.Select<District>().LeftJoin(d => d.ParentCode == d.Parent.Code).ToTreeList();
 | 
				
			||||||
            Assert.Equal(1, ddd.Count);
 | 
					            Assert.Single(ddd);
 | 
				
			||||||
            Assert.Equal(2, ddd[0].Childs.Count);
 | 
					            Assert.Equal(2, ddd[0].Childs.Count);
 | 
				
			||||||
        }
 | 
					        }
 | 
				
			||||||
        public class District
 | 
					        public class District
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -211,7 +211,7 @@ namespace FreeSql.Tests.Odbc.Oracle
 | 
				
			|||||||
                })
 | 
					                })
 | 
				
			||||||
            });
 | 
					            });
 | 
				
			||||||
            var ddd = g.oracle.Select<District>().LeftJoin(d => d.ParentCode == d.Parent.Code).ToTreeList();
 | 
					            var ddd = g.oracle.Select<District>().LeftJoin(d => d.ParentCode == d.Parent.Code).ToTreeList();
 | 
				
			||||||
            Assert.Equal(1, ddd.Count);
 | 
					            Assert.Single(ddd);
 | 
				
			||||||
            Assert.Equal(2, ddd[0].Childs.Count);
 | 
					            Assert.Equal(2, ddd[0].Childs.Count);
 | 
				
			||||||
        }
 | 
					        }
 | 
				
			||||||
        public class District
 | 
					        public class District
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -287,7 +287,7 @@ namespace FreeSql.Tests.Odbc.PostgreSQL
 | 
				
			|||||||
                })
 | 
					                })
 | 
				
			||||||
            });
 | 
					            });
 | 
				
			||||||
            var ddd = g.pgsql.Select<District>().LeftJoin(d => d.ParentCode == d.Parent.Code).ToTreeList();
 | 
					            var ddd = g.pgsql.Select<District>().LeftJoin(d => d.ParentCode == d.Parent.Code).ToTreeList();
 | 
				
			||||||
            Assert.Equal(1, ddd.Count);
 | 
					            Assert.Single(ddd);
 | 
				
			||||||
            Assert.Equal(2, ddd[0].Childs.Count);
 | 
					            Assert.Equal(2, ddd[0].Childs.Count);
 | 
				
			||||||
        }
 | 
					        }
 | 
				
			||||||
        public class District
 | 
					        public class District
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -201,7 +201,7 @@ namespace FreeSql.Tests.Odbc.SqlServer
 | 
				
			|||||||
                })
 | 
					                })
 | 
				
			||||||
            });
 | 
					            });
 | 
				
			||||||
            var ddd = g.sqlserver.Select<District>().LeftJoin(d => d.ParentCode == d.Parent.Code).ToTreeList();
 | 
					            var ddd = g.sqlserver.Select<District>().LeftJoin(d => d.ParentCode == d.Parent.Code).ToTreeList();
 | 
				
			||||||
            Assert.Equal(1, ddd.Count);
 | 
					            Assert.Single(ddd);
 | 
				
			||||||
            Assert.Equal(2, ddd[0].Childs.Count);
 | 
					            Assert.Equal(2, ddd[0].Childs.Count);
 | 
				
			||||||
        }
 | 
					        }
 | 
				
			||||||
        public class District
 | 
					        public class District
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -35,7 +35,7 @@ public class g
 | 
				
			|||||||
        //.UseConnectionFactory(FreeSql.DataType.OdbcOracle, () => new System.Data.Odbc.OdbcConnection("Driver={Oracle in XE};Server=//127.0.0.1:1521/XE;Persist Security Info=False;Trusted_Connection=Yes;UID=odbc1;PWD=123456"))
 | 
					        //.UseConnectionFactory(FreeSql.DataType.OdbcOracle, () => new System.Data.Odbc.OdbcConnection("Driver={Oracle in XE};Server=//127.0.0.1:1521/XE;Persist Security Info=False;Trusted_Connection=Yes;UID=odbc1;PWD=123456"))
 | 
				
			||||||
        .UseAutoSyncStructure(true)
 | 
					        .UseAutoSyncStructure(true)
 | 
				
			||||||
        .UseLazyLoading(true)
 | 
					        .UseLazyLoading(true)
 | 
				
			||||||
        .UseSyncStructureToUpper(true)
 | 
					        .UseNameConvert(FreeSql.Internal.NameConvertType.ToUpper)
 | 
				
			||||||
        //.UseNoneCommandParameter(true)
 | 
					        //.UseNoneCommandParameter(true)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        .UseMonitorCommand(
 | 
					        .UseMonitorCommand(
 | 
				
			||||||
@@ -50,7 +50,7 @@ public class g
 | 
				
			|||||||
        .UseConnectionString(FreeSql.DataType.OdbcPostgreSQL, "Driver={PostgreSQL Unicode(x64)};Server=192.168.164.10;Port=5432;UID=postgres;PWD=123456;Database=tedb_odbc;Pooling=true;Maximum Pool Size=2")
 | 
					        .UseConnectionString(FreeSql.DataType.OdbcPostgreSQL, "Driver={PostgreSQL Unicode(x64)};Server=192.168.164.10;Port=5432;UID=postgres;PWD=123456;Database=tedb_odbc;Pooling=true;Maximum Pool Size=2")
 | 
				
			||||||
        //.UseConnectionFactory(FreeSql.DataType.OdbcPostgreSQL, () => new System.Data.Odbc.OdbcConnection("Driver={PostgreSQL Unicode(x64)};Server=192.168.164.10;Port=5432;UID=postgres;PWD=123456;Database=tedb_odbc;Pooling=true;"))
 | 
					        //.UseConnectionFactory(FreeSql.DataType.OdbcPostgreSQL, () => new System.Data.Odbc.OdbcConnection("Driver={PostgreSQL Unicode(x64)};Server=192.168.164.10;Port=5432;UID=postgres;PWD=123456;Database=tedb_odbc;Pooling=true;"))
 | 
				
			||||||
        .UseAutoSyncStructure(true)
 | 
					        .UseAutoSyncStructure(true)
 | 
				
			||||||
        .UseSyncStructureToLower(true)
 | 
					        .UseNameConvert(FreeSql.Internal.NameConvertType.ToLower)
 | 
				
			||||||
        .UseLazyLoading(true)
 | 
					        .UseLazyLoading(true)
 | 
				
			||||||
        .UseMonitorCommand(
 | 
					        .UseMonitorCommand(
 | 
				
			||||||
            cmd => Trace.WriteLine(cmd.CommandText), //监听SQL命令对象,在执行前
 | 
					            cmd => Trace.WriteLine(cmd.CommandText), //监听SQL命令对象,在执行前
 | 
				
			||||||
@@ -74,7 +74,7 @@ public class g
 | 
				
			|||||||
        //.UseConnectionFactory(FreeSql.DataType.OdbcDameng, () => new System.Data.Odbc.OdbcConnection("Driver={DM8 ODBC DRIVER};Server=127.0.0.1:5236;Persist Security Info=False;Trusted_Connection=Yes;UID=USER1;PWD=123456789"))
 | 
					        //.UseConnectionFactory(FreeSql.DataType.OdbcDameng, () => new System.Data.Odbc.OdbcConnection("Driver={DM8 ODBC DRIVER};Server=127.0.0.1:5236;Persist Security Info=False;Trusted_Connection=Yes;UID=USER1;PWD=123456789"))
 | 
				
			||||||
        .UseAutoSyncStructure(true)
 | 
					        .UseAutoSyncStructure(true)
 | 
				
			||||||
        .UseLazyLoading(true)
 | 
					        .UseLazyLoading(true)
 | 
				
			||||||
        .UseSyncStructureToUpper(true)
 | 
					        .UseNameConvert(FreeSql.Internal.NameConvertType.ToUpper)
 | 
				
			||||||
        //.UseNoneCommandParameter(true)
 | 
					        //.UseNoneCommandParameter(true)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        .UseMonitorCommand(
 | 
					        .UseMonitorCommand(
 | 
				
			||||||
@@ -89,7 +89,7 @@ public class g
 | 
				
			|||||||
        //.UseConnectionFactory(FreeSql.DataType.OdbcDameng, () => new System.Data.Odbc.OdbcConnection("Driver={DM8 ODBC DRIVER};Server=127.0.0.1:5236;Persist Security Info=False;Trusted_Connection=Yes;UID=USER1;PWD=123456789"))
 | 
					        //.UseConnectionFactory(FreeSql.DataType.OdbcDameng, () => new System.Data.Odbc.OdbcConnection("Driver={DM8 ODBC DRIVER};Server=127.0.0.1:5236;Persist Security Info=False;Trusted_Connection=Yes;UID=USER1;PWD=123456789"))
 | 
				
			||||||
        .UseAutoSyncStructure(true)
 | 
					        .UseAutoSyncStructure(true)
 | 
				
			||||||
        .UseLazyLoading(true)
 | 
					        .UseLazyLoading(true)
 | 
				
			||||||
        .UseSyncStructureToUpper(true)
 | 
					        .UseNameConvert(FreeSql.Internal.NameConvertType.ToUpper)
 | 
				
			||||||
        //.UseNoneCommandParameter(true)
 | 
					        //.UseNoneCommandParameter(true)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        .UseMonitorCommand(
 | 
					        .UseMonitorCommand(
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -202,7 +202,7 @@ namespace FreeSql.Tests.MsAccess
 | 
				
			|||||||
                })
 | 
					                })
 | 
				
			||||||
            });
 | 
					            });
 | 
				
			||||||
            var ddd = g.msaccess.Select<District>().LeftJoin(d => d.ParentCode == d.Parent.Code).ToTreeList();
 | 
					            var ddd = g.msaccess.Select<District>().LeftJoin(d => d.ParentCode == d.Parent.Code).ToTreeList();
 | 
				
			||||||
            Assert.Equal(1, ddd.Count);
 | 
					            Assert.Single(ddd);
 | 
				
			||||||
            Assert.Equal(2, ddd[0].Childs.Count);
 | 
					            Assert.Equal(2, ddd[0].Childs.Count);
 | 
				
			||||||
        }
 | 
					        }
 | 
				
			||||||
        public class District
 | 
					        public class District
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -311,7 +311,7 @@ namespace FreeSql.Tests.MySql
 | 
				
			|||||||
                })
 | 
					                })
 | 
				
			||||||
            });
 | 
					            });
 | 
				
			||||||
            var ddd = g.mysql.Select<District>().LeftJoin(d => d.ParentCode == d.Parent.Code).ToTreeList();
 | 
					            var ddd = g.mysql.Select<District>().LeftJoin(d => d.ParentCode == d.Parent.Code).ToTreeList();
 | 
				
			||||||
            Assert.Equal(1, ddd.Count);
 | 
					            Assert.Single(ddd);
 | 
				
			||||||
            Assert.Equal(2, ddd[0].Childs.Count);
 | 
					            Assert.Equal(2, ddd[0].Childs.Count);
 | 
				
			||||||
        }
 | 
					        }
 | 
				
			||||||
        public class District
 | 
					        public class District
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -211,7 +211,7 @@ namespace FreeSql.Tests.Oracle
 | 
				
			|||||||
                })
 | 
					                })
 | 
				
			||||||
            });
 | 
					            });
 | 
				
			||||||
            var ddd = g.oracle.Select<District>().LeftJoin(d => d.ParentCode == d.Parent.Code).ToTreeList();
 | 
					            var ddd = g.oracle.Select<District>().LeftJoin(d => d.ParentCode == d.Parent.Code).ToTreeList();
 | 
				
			||||||
            Assert.Equal(1, ddd.Count);
 | 
					            Assert.Single(ddd);
 | 
				
			||||||
            Assert.Equal(2, ddd[0].Childs.Count);
 | 
					            Assert.Equal(2, ddd[0].Childs.Count);
 | 
				
			||||||
        }
 | 
					        }
 | 
				
			||||||
        public class District
 | 
					        public class District
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -287,7 +287,7 @@ namespace FreeSql.Tests.PostgreSQL
 | 
				
			|||||||
                })
 | 
					                })
 | 
				
			||||||
            });
 | 
					            });
 | 
				
			||||||
            var ddd = g.pgsql.Select<District>().LeftJoin(d => d.ParentCode == d.Parent.Code).ToTreeList();
 | 
					            var ddd = g.pgsql.Select<District>().LeftJoin(d => d.ParentCode == d.Parent.Code).ToTreeList();
 | 
				
			||||||
            Assert.Equal(1, ddd.Count);
 | 
					            Assert.Single(ddd);
 | 
				
			||||||
            Assert.Equal(2, ddd[0].Childs.Count);
 | 
					            Assert.Equal(2, ddd[0].Childs.Count);
 | 
				
			||||||
        }
 | 
					        }
 | 
				
			||||||
        public class District
 | 
					        public class District
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -211,7 +211,7 @@ namespace FreeSql.Tests.SqlServer
 | 
				
			|||||||
                })
 | 
					                })
 | 
				
			||||||
            });
 | 
					            });
 | 
				
			||||||
            var ddd = g.sqlserver.Select<District>().LeftJoin(d => d.ParentCode == d.Parent.Code).ToTreeList();
 | 
					            var ddd = g.sqlserver.Select<District>().LeftJoin(d => d.ParentCode == d.Parent.Code).ToTreeList();
 | 
				
			||||||
            Assert.Equal(1, ddd.Count);
 | 
					            Assert.Single(ddd);
 | 
				
			||||||
            Assert.Equal(2, ddd[0].Childs.Count);
 | 
					            Assert.Equal(2, ddd[0].Childs.Count);
 | 
				
			||||||
        }
 | 
					        }
 | 
				
			||||||
        public class District
 | 
					        public class District
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -228,7 +228,7 @@ namespace FreeSql.Tests.Sqlite
 | 
				
			|||||||
                })
 | 
					                })
 | 
				
			||||||
            });
 | 
					            });
 | 
				
			||||||
            var ddd = g.sqlite.Select<District>().LeftJoin(d => d.ParentCode == d.Parent.Code).ToTreeList();
 | 
					            var ddd = g.sqlite.Select<District>().LeftJoin(d => d.ParentCode == d.Parent.Code).ToTreeList();
 | 
				
			||||||
            Assert.Equal(1, ddd.Count);
 | 
					            Assert.Single(ddd);
 | 
				
			||||||
            Assert.Equal(2, ddd[0].Childs.Count);
 | 
					            Assert.Equal(2, ddd[0].Childs.Count);
 | 
				
			||||||
        }
 | 
					        }
 | 
				
			||||||
        public class District
 | 
					        public class District
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -574,7 +574,7 @@ namespace FreeSql.Tests
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
            IFreeSql fsql = new FreeSql.FreeSqlBuilder()
 | 
					            IFreeSql fsql = new FreeSql.FreeSqlBuilder()
 | 
				
			||||||
              .UseConnectionString(FreeSql.DataType.PostgreSQL, "Host=192.168.164.10;Port=5432;Username=postgres;Password=123456;Database=tedb;Pooling=true;Maximum Pool Size=7")
 | 
					              .UseConnectionString(FreeSql.DataType.PostgreSQL, "Host=192.168.164.10;Port=5432;Username=postgres;Password=123456;Database=tedb;Pooling=true;Maximum Pool Size=7")
 | 
				
			||||||
              .UseEntityPropertyNameConvert(Internal.StringConvertType.PascalCaseToUnderscoreWithLower)
 | 
					              .UseNameConvert(Internal.NameConvertType.PascalCaseToUnderscoreWithLower)
 | 
				
			||||||
              .UseNoneCommandParameter(true)
 | 
					              .UseNoneCommandParameter(true)
 | 
				
			||||||
              .UseAutoSyncStructure(true) //自动同步实体结构到数据库
 | 
					              .UseAutoSyncStructure(true) //自动同步实体结构到数据库
 | 
				
			||||||
              .UseMonitorCommand(a => Trace.WriteLine(a.CommandText))
 | 
					              .UseMonitorCommand(a => Trace.WriteLine(a.CommandText))
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -247,7 +247,7 @@ namespace FreeSql.Tests
 | 
				
			|||||||
                .UseAutoSyncStructure(true)
 | 
					                .UseAutoSyncStructure(true)
 | 
				
			||||||
                .UseGenerateCommandParameterWithLambda(true)
 | 
					                .UseGenerateCommandParameterWithLambda(true)
 | 
				
			||||||
                .UseLazyLoading(true)
 | 
					                .UseLazyLoading(true)
 | 
				
			||||||
                .UseSyncStructureToUpper(true)
 | 
					                .UseNameConvert(FreeSql.Internal.NameConvertType.ToUpper)
 | 
				
			||||||
                .UseMonitorCommand(cmd => Trace.WriteLine("\r\n线程" + Thread.CurrentThread.ManagedThreadId + ": " + cmd.CommandText))
 | 
					                .UseMonitorCommand(cmd => Trace.WriteLine("\r\n线程" + Thread.CurrentThread.ManagedThreadId + ": " + cmd.CommandText))
 | 
				
			||||||
                .Build());
 | 
					                .Build());
 | 
				
			||||||
            ib.Register("db3", () => new FreeSql.FreeSqlBuilder()
 | 
					            ib.Register("db3", () => new FreeSql.FreeSqlBuilder()
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -29,7 +29,7 @@ public class g
 | 
				
			|||||||
        //.UseConnectionFactory(FreeSql.DataType.PostgreSQL, () => new Npgsql.NpgsqlConnection("Host=192.168.164.10;Port=5432;Username=postgres;Password=123456;Database=tedb;Pooling=true;"))
 | 
					        //.UseConnectionFactory(FreeSql.DataType.PostgreSQL, () => new Npgsql.NpgsqlConnection("Host=192.168.164.10;Port=5432;Username=postgres;Password=123456;Database=tedb;Pooling=true;"))
 | 
				
			||||||
        .UseAutoSyncStructure(true)
 | 
					        .UseAutoSyncStructure(true)
 | 
				
			||||||
        //.UseGenerateCommandParameterWithLambda(true)
 | 
					        //.UseGenerateCommandParameterWithLambda(true)
 | 
				
			||||||
        .UseSyncStructureToLower(true)
 | 
					        .UseNameConvert(FreeSql.Internal.NameConvertType.ToLower)
 | 
				
			||||||
        .UseLazyLoading(true)
 | 
					        .UseLazyLoading(true)
 | 
				
			||||||
        .UseMonitorCommand(
 | 
					        .UseMonitorCommand(
 | 
				
			||||||
            cmd => Trace.WriteLine("\r\n线程" + Thread.CurrentThread.ManagedThreadId + ": " + cmd.CommandText) //监听SQL命令对象,在执行前
 | 
					            cmd => Trace.WriteLine("\r\n线程" + Thread.CurrentThread.ManagedThreadId + ": " + cmd.CommandText) //监听SQL命令对象,在执行前
 | 
				
			||||||
@@ -60,7 +60,7 @@ public class g
 | 
				
			|||||||
        .UseAutoSyncStructure(true)
 | 
					        .UseAutoSyncStructure(true)
 | 
				
			||||||
        //.UseGenerateCommandParameterWithLambda(true)
 | 
					        //.UseGenerateCommandParameterWithLambda(true)
 | 
				
			||||||
        .UseLazyLoading(true)
 | 
					        .UseLazyLoading(true)
 | 
				
			||||||
        .UseSyncStructureToUpper(true)
 | 
					        .UseNameConvert(FreeSql.Internal.NameConvertType.ToUpper)
 | 
				
			||||||
        //.UseNoneCommandParameter(true)
 | 
					        //.UseNoneCommandParameter(true)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        .UseMonitorCommand(
 | 
					        .UseMonitorCommand(
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -902,10 +902,11 @@
 | 
				
			|||||||
            </summary>
 | 
					            </summary>
 | 
				
			||||||
            <returns></returns>
 | 
					            <returns></returns>
 | 
				
			||||||
        </member>
 | 
					        </member>
 | 
				
			||||||
        <member name="M:FreeSql.IInsert`1.NoneParameter">
 | 
					        <member name="M:FreeSql.IInsert`1.NoneParameter(System.Boolean)">
 | 
				
			||||||
            <summary>
 | 
					            <summary>
 | 
				
			||||||
            不使用参数化,可通过 IFreeSql.CodeFirst.IsNotCommandParameter 全局性设置
 | 
					            不使用参数化,可通过 IFreeSql.CodeFirst.IsNotCommandParameter 全局性设置
 | 
				
			||||||
            </summary>
 | 
					            </summary>
 | 
				
			||||||
 | 
					            <param name="isNotCommandParameter">是否不使用参数化</param>
 | 
				
			||||||
            <returns></returns>
 | 
					            <returns></returns>
 | 
				
			||||||
        </member>
 | 
					        </member>
 | 
				
			||||||
        <member name="M:FreeSql.IInsert`1.BatchOptions(System.Int32,System.Int32,System.Boolean)">
 | 
					        <member name="M:FreeSql.IInsert`1.BatchOptions(System.Int32,System.Int32,System.Boolean)">
 | 
				
			||||||
@@ -1937,10 +1938,11 @@
 | 
				
			|||||||
            <param name="connection"></param>
 | 
					            <param name="connection"></param>
 | 
				
			||||||
            <returns></returns>
 | 
					            <returns></returns>
 | 
				
			||||||
        </member>
 | 
					        </member>
 | 
				
			||||||
        <member name="M:FreeSql.IUpdate`1.NoneParameter">
 | 
					        <member name="M:FreeSql.IUpdate`1.NoneParameter(System.Boolean)">
 | 
				
			||||||
            <summary>
 | 
					            <summary>
 | 
				
			||||||
            不使用参数化,可通过 IFreeSql.CodeFirst.IsNotCommandParameter 全局性设置
 | 
					            不使用参数化,可通过 IFreeSql.CodeFirst.IsNotCommandParameter 全局性设置
 | 
				
			||||||
            </summary>
 | 
					            </summary>
 | 
				
			||||||
 | 
					            <param name="isNotCommandParameter">是否不使用参数化</param>
 | 
				
			||||||
            <returns></returns>
 | 
					            <returns></returns>
 | 
				
			||||||
        </member>
 | 
					        </member>
 | 
				
			||||||
        <member name="M:FreeSql.IUpdate`1.BatchOptions(System.Int32,System.Int32,System.Boolean)">
 | 
					        <member name="M:FreeSql.IUpdate`1.BatchOptions(System.Int32,System.Int32,System.Boolean)">
 | 
				
			||||||
@@ -2692,12 +2694,12 @@
 | 
				
			|||||||
        </member>
 | 
					        </member>
 | 
				
			||||||
        <member name="P:FreeSql.ICodeFirst.IsSyncStructureToLower">
 | 
					        <member name="P:FreeSql.ICodeFirst.IsSyncStructureToLower">
 | 
				
			||||||
            <summary>
 | 
					            <summary>
 | 
				
			||||||
            转小写同步结构
 | 
					            转小写同步结构,适用 PostgreSQL
 | 
				
			||||||
            </summary>
 | 
					            </summary>
 | 
				
			||||||
        </member>
 | 
					        </member>
 | 
				
			||||||
        <member name="P:FreeSql.ICodeFirst.IsSyncStructureToUpper">
 | 
					        <member name="P:FreeSql.ICodeFirst.IsSyncStructureToUpper">
 | 
				
			||||||
            <summary>
 | 
					            <summary>
 | 
				
			||||||
            转大写同步结构
 | 
					            转大写同步结构,适用 Oracle/达梦
 | 
				
			||||||
            </summary>
 | 
					            </summary>
 | 
				
			||||||
        </member>
 | 
					        </member>
 | 
				
			||||||
        <member name="P:FreeSql.ICodeFirst.IsConfigEntityFromDbFirst">
 | 
					        <member name="P:FreeSql.ICodeFirst.IsConfigEntityFromDbFirst">
 | 
				
			||||||
@@ -3178,14 +3180,52 @@
 | 
				
			|||||||
            BigApple -> bigapple
 | 
					            BigApple -> bigapple
 | 
				
			||||||
            </summary>
 | 
					            </summary>
 | 
				
			||||||
        </member>
 | 
					        </member>
 | 
				
			||||||
        <member name="M:FreeSql.Internal.StringUtils.PascalCaseToUnderScore(System.String)">
 | 
					        <member name="F:FreeSql.Internal.NameConvertType.None">
 | 
				
			||||||
 | 
					            <summary>
 | 
				
			||||||
 | 
					            不进行任何处理
 | 
				
			||||||
 | 
					            </summary>
 | 
				
			||||||
 | 
					        </member>
 | 
				
			||||||
 | 
					        <member name="F:FreeSql.Internal.NameConvertType.PascalCaseToUnderscore">
 | 
				
			||||||
            <summary>
 | 
					            <summary>
 | 
				
			||||||
            将帕斯卡命名字符串转换为下划线分隔字符串
 | 
					            将帕斯卡命名字符串转换为下划线分隔字符串
 | 
				
			||||||
            <para></para>
 | 
					            <para></para>
 | 
				
			||||||
            BigApple -> Big_Apple
 | 
					            BigApple -> Big_Apple
 | 
				
			||||||
            </summary>
 | 
					            </summary>
 | 
				
			||||||
            <param name="str"></param>
 | 
					        </member>
 | 
				
			||||||
            <returns></returns>
 | 
					        <member name="F:FreeSql.Internal.NameConvertType.PascalCaseToUnderscoreWithUpper">
 | 
				
			||||||
 | 
					            <summary>
 | 
				
			||||||
 | 
					            将帕斯卡命名字符串转换为下划线分隔字符串,且转换为全大写
 | 
				
			||||||
 | 
					            <para></para>
 | 
				
			||||||
 | 
					            BigApple -> BIG_APPLE
 | 
				
			||||||
 | 
					            </summary>
 | 
				
			||||||
 | 
					        </member>
 | 
				
			||||||
 | 
					        <member name="F:FreeSql.Internal.NameConvertType.PascalCaseToUnderscoreWithLower">
 | 
				
			||||||
 | 
					            <summary>
 | 
				
			||||||
 | 
					            将帕斯卡命名字符串转换为下划线分隔字符串,且转换为全小写
 | 
				
			||||||
 | 
					            <para></para>
 | 
				
			||||||
 | 
					            BigApple -> big_apple
 | 
				
			||||||
 | 
					            </summary>
 | 
				
			||||||
 | 
					        </member>
 | 
				
			||||||
 | 
					        <member name="F:FreeSql.Internal.NameConvertType.UnderscoreToPascalCase">
 | 
				
			||||||
 | 
					            <summary>
 | 
				
			||||||
 | 
					            将下划线分隔字符串命名字符串转换为帕斯卡
 | 
				
			||||||
 | 
					            <para></para>
 | 
				
			||||||
 | 
					            big_apple -> BigApple
 | 
				
			||||||
 | 
					            </summary>
 | 
				
			||||||
 | 
					        </member>
 | 
				
			||||||
 | 
					        <member name="F:FreeSql.Internal.NameConvertType.ToUpper">
 | 
				
			||||||
 | 
					            <summary>
 | 
				
			||||||
 | 
					            将字符串转换为大写
 | 
				
			||||||
 | 
					            <para></para>
 | 
				
			||||||
 | 
					            BigApple -> BIGAPPLE
 | 
				
			||||||
 | 
					            </summary>
 | 
				
			||||||
 | 
					        </member>
 | 
				
			||||||
 | 
					        <member name="F:FreeSql.Internal.NameConvertType.ToLower">
 | 
				
			||||||
 | 
					            <summary>
 | 
				
			||||||
 | 
					            将字符串转换为小写
 | 
				
			||||||
 | 
					            <para></para>
 | 
				
			||||||
 | 
					            BigApple -> bigapple
 | 
				
			||||||
 | 
					            </summary>
 | 
				
			||||||
        </member>
 | 
					        </member>
 | 
				
			||||||
        <member name="M:FreeSqlGlobalExpressionCall.Between(System.DateTime,System.DateTime,System.DateTime)">
 | 
					        <member name="M:FreeSqlGlobalExpressionCall.Between(System.DateTime,System.DateTime,System.DateTime)">
 | 
				
			||||||
            <summary>
 | 
					            <summary>
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -21,6 +21,7 @@ namespace FreeSql
 | 
				
			|||||||
        bool _isGenerateCommandParameterWithLambda = false;
 | 
					        bool _isGenerateCommandParameterWithLambda = false;
 | 
				
			||||||
        bool _isLazyLoading = false;
 | 
					        bool _isLazyLoading = false;
 | 
				
			||||||
        StringConvertType _entityPropertyConvertType = StringConvertType.None;
 | 
					        StringConvertType _entityPropertyConvertType = StringConvertType.None;
 | 
				
			||||||
 | 
					        NameConvertType _nameConvertType = NameConvertType.None;
 | 
				
			||||||
        Action<DbCommand> _aopCommandExecuting = null;
 | 
					        Action<DbCommand> _aopCommandExecuting = null;
 | 
				
			||||||
        Action<DbCommand, string> _aopCommandExecuted = null;
 | 
					        Action<DbCommand, string> _aopCommandExecuted = null;
 | 
				
			||||||
        Type _providerType = null;
 | 
					        Type _providerType = null;
 | 
				
			||||||
@@ -82,6 +83,7 @@ namespace FreeSql
 | 
				
			|||||||
        /// </summary>
 | 
					        /// </summary>
 | 
				
			||||||
        /// <param name="value">true:转小写, false:不转</param>
 | 
					        /// <param name="value">true:转小写, false:不转</param>
 | 
				
			||||||
        /// <returns></returns>
 | 
					        /// <returns></returns>
 | 
				
			||||||
 | 
					        [Obsolete("请使用 UseNameConvert(NameConvertType.ToLower),或者 fsql.CodeFirst.IsSyncStructureToLower = value")]
 | 
				
			||||||
        public FreeSqlBuilder UseSyncStructureToLower(bool value)
 | 
					        public FreeSqlBuilder UseSyncStructureToLower(bool value)
 | 
				
			||||||
        {
 | 
					        {
 | 
				
			||||||
            _isSyncStructureToLower = value;
 | 
					            _isSyncStructureToLower = value;
 | 
				
			||||||
@@ -92,6 +94,7 @@ namespace FreeSql
 | 
				
			|||||||
        /// </summary>
 | 
					        /// </summary>
 | 
				
			||||||
        /// <param name="value">true:转大写, false:不转</param>
 | 
					        /// <param name="value">true:转大写, false:不转</param>
 | 
				
			||||||
        /// <returns></returns>
 | 
					        /// <returns></returns>
 | 
				
			||||||
 | 
					        [Obsolete("请使用 UseNameConvert(NameConvertType.ToUpper),或者 fsql.CodeFirst.IsSyncStructureToUpper = value")]
 | 
				
			||||||
        public FreeSqlBuilder UseSyncStructureToUpper(bool value)
 | 
					        public FreeSqlBuilder UseSyncStructureToUpper(bool value)
 | 
				
			||||||
        {
 | 
					        {
 | 
				
			||||||
            _isSyncStructureToUpper = value;
 | 
					            _isSyncStructureToUpper = value;
 | 
				
			||||||
@@ -163,12 +166,25 @@ namespace FreeSql
 | 
				
			|||||||
        /// </summary>
 | 
					        /// </summary>
 | 
				
			||||||
        /// <param name="convertType"></param>
 | 
					        /// <param name="convertType"></param>
 | 
				
			||||||
        /// <returns></returns>
 | 
					        /// <returns></returns>
 | 
				
			||||||
 | 
					        [Obsolete("请使用 UseNameConvert 功能")]
 | 
				
			||||||
        public FreeSqlBuilder UseEntityPropertyNameConvert(StringConvertType convertType)
 | 
					        public FreeSqlBuilder UseEntityPropertyNameConvert(StringConvertType convertType)
 | 
				
			||||||
        {
 | 
					        {
 | 
				
			||||||
            _entityPropertyConvertType = convertType;
 | 
					            _entityPropertyConvertType = convertType;
 | 
				
			||||||
            return this;
 | 
					            return this;
 | 
				
			||||||
        }
 | 
					        }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        /// <summary>
 | 
				
			||||||
 | 
					        /// 实体类名 -> 数据库表名,命名转换(类名、属性名都生效)<para></para>
 | 
				
			||||||
 | 
					        /// 优先级小于 [Table(Name = "xxx")]、[Column(Name = "xxx")]
 | 
				
			||||||
 | 
					        /// </summary>
 | 
				
			||||||
 | 
					        /// <param name="convertType"></param>
 | 
				
			||||||
 | 
					        /// <returns></returns>
 | 
				
			||||||
 | 
					        public FreeSqlBuilder UseNameConvert(NameConvertType convertType)
 | 
				
			||||||
 | 
					        {
 | 
				
			||||||
 | 
					            _nameConvertType = convertType;
 | 
				
			||||||
 | 
					            return this;
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        public IFreeSql Build() => Build<IFreeSql>();
 | 
					        public IFreeSql Build() => Build<IFreeSql>();
 | 
				
			||||||
        public IFreeSql<TMark> Build<TMark>()
 | 
					        public IFreeSql<TMark> Build<TMark>()
 | 
				
			||||||
        {
 | 
					        {
 | 
				
			||||||
@@ -263,27 +279,60 @@ namespace FreeSql
 | 
				
			|||||||
                //添加实体属性名全局AOP转换处理
 | 
					                //添加实体属性名全局AOP转换处理
 | 
				
			||||||
                if (_entityPropertyConvertType != StringConvertType.None)
 | 
					                if (_entityPropertyConvertType != StringConvertType.None)
 | 
				
			||||||
                {
 | 
					                {
 | 
				
			||||||
 | 
					                    string PascalCaseToUnderScore(string str) => string.Concat(str.Select((x, i) => i > 0 && char.IsUpper(x) ? "_" + x.ToString() : x.ToString()));
 | 
				
			||||||
 | 
					
 | 
				
			||||||
                    switch (_entityPropertyConvertType)
 | 
					                    switch (_entityPropertyConvertType)
 | 
				
			||||||
                    {
 | 
					                    {
 | 
				
			||||||
                        case StringConvertType.Lower:
 | 
					                        case StringConvertType.Lower:
 | 
				
			||||||
                            ret.Aop.ConfigEntityProperty += (_, e) =>
 | 
					                            ret.Aop.ConfigEntityProperty += (_, e) => e.ModifyResult.Name = e.Property.Name.ToLower();
 | 
				
			||||||
                                e.ModifyResult.Name = e.Property.Name.ToLower();
 | 
					 | 
				
			||||||
                            break;
 | 
					                            break;
 | 
				
			||||||
                        case StringConvertType.Upper:
 | 
					                        case StringConvertType.Upper:
 | 
				
			||||||
                            ret.Aop.ConfigEntityProperty += (_, e) =>
 | 
					                            ret.Aop.ConfigEntityProperty += (_, e) => e.ModifyResult.Name = e.Property.Name.ToUpper();
 | 
				
			||||||
                                e.ModifyResult.Name = e.Property.Name.ToUpper();
 | 
					 | 
				
			||||||
                            break;
 | 
					                            break;
 | 
				
			||||||
                        case StringConvertType.PascalCaseToUnderscore:
 | 
					                        case StringConvertType.PascalCaseToUnderscore:
 | 
				
			||||||
                            ret.Aop.ConfigEntityProperty += (_, e) =>
 | 
					                            ret.Aop.ConfigEntityProperty += (_, e) => e.ModifyResult.Name = PascalCaseToUnderScore(e.Property.Name);
 | 
				
			||||||
                                e.ModifyResult.Name = StringUtils.PascalCaseToUnderScore(e.Property.Name);
 | 
					 | 
				
			||||||
                            break;
 | 
					                            break;
 | 
				
			||||||
                        case StringConvertType.PascalCaseToUnderscoreWithLower:
 | 
					                        case StringConvertType.PascalCaseToUnderscoreWithLower:
 | 
				
			||||||
                            ret.Aop.ConfigEntityProperty += (_, e) =>
 | 
					                            ret.Aop.ConfigEntityProperty += (_, e) => e.ModifyResult.Name = PascalCaseToUnderScore(e.Property.Name).ToLower();
 | 
				
			||||||
                                e.ModifyResult.Name = StringUtils.PascalCaseToUnderScore(e.Property.Name).ToLower();
 | 
					 | 
				
			||||||
                            break;
 | 
					                            break;
 | 
				
			||||||
                        case StringConvertType.PascalCaseToUnderscoreWithUpper:
 | 
					                        case StringConvertType.PascalCaseToUnderscoreWithUpper:
 | 
				
			||||||
                            ret.Aop.ConfigEntityProperty += (_, e) =>
 | 
					                            ret.Aop.ConfigEntityProperty += (_, e) => e.ModifyResult.Name = PascalCaseToUnderScore(e.Property.Name).ToUpper();
 | 
				
			||||||
                                e.ModifyResult.Name = StringUtils.PascalCaseToUnderScore(e.Property.Name).ToUpper();
 | 
					                            break;
 | 
				
			||||||
 | 
					                        default:
 | 
				
			||||||
 | 
					                            break;
 | 
				
			||||||
 | 
					                    }
 | 
				
			||||||
 | 
					                }
 | 
				
			||||||
 | 
					                //添加实体属性名全局AOP转换处理
 | 
				
			||||||
 | 
					                if (_nameConvertType != NameConvertType.None)
 | 
				
			||||||
 | 
					                {
 | 
				
			||||||
 | 
					                    string PascalCaseToUnderScore(string str) => string.Concat(str.Select((x, i) => i > 0 && char.IsUpper(x) ? "_" + x.ToString() : x.ToString()));
 | 
				
			||||||
 | 
					                    string UnderScorePascalCase(string str) => string.Join("", str.Split('_').Select(a => a.Length > 0 ? string.Concat(char.ToUpper(a[0]), a.Substring(1)) : ""));
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					                    switch (_nameConvertType)
 | 
				
			||||||
 | 
					                    {
 | 
				
			||||||
 | 
					                        case NameConvertType.ToLower:
 | 
				
			||||||
 | 
					                            ret.Aop.ConfigEntity += (_, e) => e.ModifyResult.Name = e.EntityType.Name.ToLower();
 | 
				
			||||||
 | 
					                            ret.Aop.ConfigEntityProperty += (_, e) => e.ModifyResult.Name = e.Property.Name.ToLower();
 | 
				
			||||||
 | 
					                            break;
 | 
				
			||||||
 | 
					                        case NameConvertType.ToUpper:
 | 
				
			||||||
 | 
					                            ret.Aop.ConfigEntity += (_, e) => e.ModifyResult.Name = e.EntityType.Name.ToUpper();
 | 
				
			||||||
 | 
					                            ret.Aop.ConfigEntityProperty += (_, e) => e.ModifyResult.Name = e.Property.Name.ToUpper();
 | 
				
			||||||
 | 
					                            break;
 | 
				
			||||||
 | 
					                        case NameConvertType.PascalCaseToUnderscore:
 | 
				
			||||||
 | 
					                            ret.Aop.ConfigEntity += (_, e) => e.ModifyResult.Name = PascalCaseToUnderScore(e.EntityType.Name);
 | 
				
			||||||
 | 
					                            ret.Aop.ConfigEntityProperty += (_, e) => e.ModifyResult.Name = PascalCaseToUnderScore(e.Property.Name);
 | 
				
			||||||
 | 
					                            break;
 | 
				
			||||||
 | 
					                        case NameConvertType.PascalCaseToUnderscoreWithLower:
 | 
				
			||||||
 | 
					                            ret.Aop.ConfigEntity += (_, e) => e.ModifyResult.Name = PascalCaseToUnderScore(e.EntityType.Name).ToLower();
 | 
				
			||||||
 | 
					                            ret.Aop.ConfigEntityProperty += (_, e) => e.ModifyResult.Name = PascalCaseToUnderScore(e.Property.Name).ToLower();
 | 
				
			||||||
 | 
					                            break;
 | 
				
			||||||
 | 
					                        case NameConvertType.PascalCaseToUnderscoreWithUpper:
 | 
				
			||||||
 | 
					                            ret.Aop.ConfigEntity += (_, e) => e.ModifyResult.Name = PascalCaseToUnderScore(e.EntityType.Name).ToUpper();
 | 
				
			||||||
 | 
					                            ret.Aop.ConfigEntityProperty += (_, e) => e.ModifyResult.Name = PascalCaseToUnderScore(e.Property.Name).ToUpper();
 | 
				
			||||||
 | 
					                            break;
 | 
				
			||||||
 | 
					                        case NameConvertType.UnderscoreToPascalCase:
 | 
				
			||||||
 | 
					                            ret.Aop.ConfigEntity += (_, e) => e.ModifyResult.Name = UnderScorePascalCase(e.EntityType.Name);
 | 
				
			||||||
 | 
					                            ret.Aop.ConfigEntityProperty += (_, e) => e.ModifyResult.Name = UnderScorePascalCase(e.Property.Name);
 | 
				
			||||||
                            break;
 | 
					                            break;
 | 
				
			||||||
                        default:
 | 
					                        default:
 | 
				
			||||||
                            break;
 | 
					                            break;
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -13,11 +13,11 @@ namespace FreeSql
 | 
				
			|||||||
        bool IsAutoSyncStructure { get; set; }
 | 
					        bool IsAutoSyncStructure { get; set; }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        /// <summary>
 | 
					        /// <summary>
 | 
				
			||||||
        /// 转小写同步结构
 | 
					        /// 转小写同步结构,适用 PostgreSQL
 | 
				
			||||||
        /// </summary>
 | 
					        /// </summary>
 | 
				
			||||||
        bool IsSyncStructureToLower { get; set; }
 | 
					        bool IsSyncStructureToLower { get; set; }
 | 
				
			||||||
        /// <summary>
 | 
					        /// <summary>
 | 
				
			||||||
        /// 转大写同步结构
 | 
					        /// 转大写同步结构,适用 Oracle/达梦
 | 
				
			||||||
        /// </summary>
 | 
					        /// </summary>
 | 
				
			||||||
        bool IsSyncStructureToUpper { get; set; }
 | 
					        bool IsSyncStructureToUpper { get; set; }
 | 
				
			||||||
        /// <summary>
 | 
					        /// <summary>
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -1,4 +1,6 @@
 | 
				
			|||||||
namespace FreeSql.Internal
 | 
					using System;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					namespace FreeSql.Internal
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
    public enum StringConvertType
 | 
					    public enum StringConvertType
 | 
				
			||||||
    {
 | 
					    {
 | 
				
			||||||
@@ -42,4 +44,54 @@
 | 
				
			|||||||
        /// </summary>
 | 
					        /// </summary>
 | 
				
			||||||
        Lower
 | 
					        Lower
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    public enum NameConvertType
 | 
				
			||||||
 | 
					    {
 | 
				
			||||||
 | 
					        /// <summary>
 | 
				
			||||||
 | 
					        /// 不进行任何处理
 | 
				
			||||||
 | 
					        /// </summary>
 | 
				
			||||||
 | 
					        None = 0,
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        /// <summary>
 | 
				
			||||||
 | 
					        /// 将帕斯卡命名字符串转换为下划线分隔字符串
 | 
				
			||||||
 | 
					        /// <para></para>
 | 
				
			||||||
 | 
					        /// BigApple -> Big_Apple
 | 
				
			||||||
 | 
					        /// </summary>
 | 
				
			||||||
 | 
					        PascalCaseToUnderscore,
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        /// <summary>
 | 
				
			||||||
 | 
					        /// 将帕斯卡命名字符串转换为下划线分隔字符串,且转换为全大写
 | 
				
			||||||
 | 
					        /// <para></para>
 | 
				
			||||||
 | 
					        /// BigApple -> BIG_APPLE
 | 
				
			||||||
 | 
					        /// </summary>
 | 
				
			||||||
 | 
					        PascalCaseToUnderscoreWithUpper,
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        /// <summary>
 | 
				
			||||||
 | 
					        /// 将帕斯卡命名字符串转换为下划线分隔字符串,且转换为全小写
 | 
				
			||||||
 | 
					        /// <para></para>
 | 
				
			||||||
 | 
					        /// BigApple -> big_apple
 | 
				
			||||||
 | 
					        /// </summary>
 | 
				
			||||||
 | 
					        PascalCaseToUnderscoreWithLower,
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        /// <summary>
 | 
				
			||||||
 | 
					        /// 将下划线分隔字符串命名字符串转换为帕斯卡
 | 
				
			||||||
 | 
					        /// <para></para>
 | 
				
			||||||
 | 
					        /// big_apple -> BigApple
 | 
				
			||||||
 | 
					        /// </summary>
 | 
				
			||||||
 | 
					        UnderscoreToPascalCase,
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        /// <summary>
 | 
				
			||||||
 | 
					        /// 将字符串转换为大写
 | 
				
			||||||
 | 
					        /// <para></para>
 | 
				
			||||||
 | 
					        /// BigApple -> BIGAPPLE
 | 
				
			||||||
 | 
					        /// </summary>
 | 
				
			||||||
 | 
					        ToUpper,
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        /// <summary>
 | 
				
			||||||
 | 
					        /// 将字符串转换为小写
 | 
				
			||||||
 | 
					        /// <para></para>
 | 
				
			||||||
 | 
					        /// BigApple -> bigapple
 | 
				
			||||||
 | 
					        /// </summary>
 | 
				
			||||||
 | 
					        ToLower
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
@@ -1,20 +0,0 @@
 | 
				
			|||||||
using System.Linq;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
namespace FreeSql.Internal
 | 
					 | 
				
			||||||
{
 | 
					 | 
				
			||||||
    public static class StringUtils
 | 
					 | 
				
			||||||
    {
 | 
					 | 
				
			||||||
        /// <summary>
 | 
					 | 
				
			||||||
        /// 将帕斯卡命名字符串转换为下划线分隔字符串
 | 
					 | 
				
			||||||
        /// <para></para>
 | 
					 | 
				
			||||||
        /// BigApple -> Big_Apple
 | 
					 | 
				
			||||||
        /// </summary>
 | 
					 | 
				
			||||||
        /// <param name="str"></param>
 | 
					 | 
				
			||||||
        /// <returns></returns>
 | 
					 | 
				
			||||||
        public static string PascalCaseToUnderScore(string str)
 | 
					 | 
				
			||||||
        {
 | 
					 | 
				
			||||||
            return string.Concat(str.Select((x, i) =>
 | 
					 | 
				
			||||||
                i > 0 && char.IsUpper(x) ? "_" + x.ToString() : x.ToString()));
 | 
					 | 
				
			||||||
        }
 | 
					 | 
				
			||||||
    }
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
		Reference in New Issue
	
	Block a user