diff --git a/FreeSql.Tests/FreeSql.Tests.Provider.Odbc/FreeSql.Tests.Provider.Odbc.xml b/FreeSql.Tests/FreeSql.Tests.Provider.Odbc/FreeSql.Tests.Provider.Odbc.xml index 95f041b4..81f32e84 100644 --- a/FreeSql.Tests/FreeSql.Tests.Provider.Odbc/FreeSql.Tests.Provider.Odbc.xml +++ b/FreeSql.Tests/FreeSql.Tests.Provider.Odbc/FreeSql.Tests.Provider.Odbc.xml @@ -9,6 +9,16 @@ 保存或添加,如果主键有值则尝试 Update,如果影响的行为 0 则尝试 Insert + + + 表中带点 + + + + + 主键 + + diff --git a/FreeSql.Tests/FreeSql.Tests.Provider.Odbc/SqlServer/SqlServerCodeFirstTest.cs b/FreeSql.Tests/FreeSql.Tests.Provider.Odbc/SqlServer/SqlServerCodeFirstTest.cs index a0e1bb2d..77987554 100644 --- a/FreeSql.Tests/FreeSql.Tests.Provider.Odbc/SqlServer/SqlServerCodeFirstTest.cs +++ b/FreeSql.Tests/FreeSql.Tests.Provider.Odbc/SqlServer/SqlServerCodeFirstTest.cs @@ -28,6 +28,40 @@ namespace FreeSql.Tests.Odbc.SqlServer public string TitleSub { get; set; } } + [Fact] + public void е() + { + var item = new tbdot01 { name = "insert" }; + g.sqlserver.Insert(item).ExecuteAffrows(); + + var find = g.sqlserver.Select().Where(a => a.id == item.id).First(); + Assert.NotNull(find); + Assert.Equal(item.id, find.id); + Assert.Equal("insert", find.name); + + Assert.Equal(1, g.sqlserver.Update().Set(a => a.name == "update").Where(a => a.id == item.id).ExecuteAffrows()); + find = g.sqlserver.Select().Where(a => a.id == item.id).First(); + Assert.NotNull(find); + Assert.Equal(item.id, find.id); + Assert.Equal("update", find.name); + + Assert.Equal(1, g.sqlserver.Delete().Where(a => a.id == item.id).ExecuteAffrows()); + find = g.sqlserver.Select().Where(a => a.id == item.id).First(); + Assert.Null(find); + } + /// + /// д + /// + [Table(Name = "[freesql.T].[dbo].[sys.tbdot01]")] + class tbdot01 + { + /// + /// + /// + public Guid id { get; set; } + public string name { get; set; } + } + [Fact] public void ı_ֶ() { diff --git a/FreeSql.Tests/FreeSql.Tests/FreeSql.Tests.xml b/FreeSql.Tests/FreeSql.Tests/FreeSql.Tests.xml index 6750270a..31e282c8 100644 --- a/FreeSql.Tests/FreeSql.Tests/FreeSql.Tests.xml +++ b/FreeSql.Tests/FreeSql.Tests/FreeSql.Tests.xml @@ -9,6 +9,16 @@ 保存或添加,如果主键有值则尝试 Update,如果影响的行为 0 则尝试 Insert + + + 表中带点 + + + + + 主键 + + @@ -262,6 +272,11 @@ 导航属性 + + + 设置字符串的 Include,使用方法和格式跟 EF Core 一样 + + 调价单 diff --git a/FreeSql.Tests/FreeSql.Tests/SqlServer/SqlServerCodeFirstTest.cs b/FreeSql.Tests/FreeSql.Tests/SqlServer/SqlServerCodeFirstTest.cs index e9334de5..be6415ff 100644 --- a/FreeSql.Tests/FreeSql.Tests/SqlServer/SqlServerCodeFirstTest.cs +++ b/FreeSql.Tests/FreeSql.Tests/SqlServer/SqlServerCodeFirstTest.cs @@ -60,6 +60,40 @@ namespace FreeSql.Tests.SqlServer public string TitleSub { get; set; } } + [Fact] + public void е() + { + var item = new tbdot01 { name = "insert" }; + g.sqlserver.Insert(item).ExecuteAffrows(); + + var find = g.sqlserver.Select().Where(a => a.id == item.id).First(); + Assert.NotNull(find); + Assert.Equal(item.id, find.id); + Assert.Equal("insert", find.name); + + Assert.Equal(1, g.sqlserver.Update().Set(a => a.name == "update").Where(a => a.id == item.id).ExecuteAffrows()); + find = g.sqlserver.Select().Where(a => a.id == item.id).First(); + Assert.NotNull(find); + Assert.Equal(item.id, find.id); + Assert.Equal("update", find.name); + + Assert.Equal(1, g.sqlserver.Delete().Where(a => a.id == item.id).ExecuteAffrows()); + find = g.sqlserver.Select().Where(a => a.id == item.id).First(); + Assert.Null(find); + } + /// + /// д + /// + [Table(Name = "[freesql.T].[dbo].[sys.tbdot01]")] + class tbdot01 + { + /// + /// + /// + public Guid id { get; set; } + public string name { get; set; } + } + [Fact] public void ı_ֶ() { diff --git a/Providers/FreeSql.Provider.Odbc/SqlServer/OdbcSqlServerCodeFirst.cs b/Providers/FreeSql.Provider.Odbc/SqlServer/OdbcSqlServerCodeFirst.cs index d6eae2bc..73519a67 100644 --- a/Providers/FreeSql.Provider.Odbc/SqlServer/OdbcSqlServerCodeFirst.cs +++ b/Providers/FreeSql.Provider.Odbc/SqlServer/OdbcSqlServerCodeFirst.cs @@ -204,8 +204,8 @@ ELSE if (tboldname == null) { //创建表 - var createTableName = _commonUtils.QuoteSqlName($"{tbname[1]}.{tbname[2]}"); - sb.Append("use ").Append(_commonUtils.QuoteSqlName(tbname[0])).Append(";\r\nCREATE TABLE ").Append(createTableName).Append(" ( "); + var createTableName = _commonUtils.QuoteSqlName(tbname[1], tbname[2]); + sb.Append("use [").Append(tbname[0]).Append("];\r\nCREATE TABLE ").Append(createTableName).Append(" ( "); var pkidx = 0; foreach (var tbcol in tb.ColumnsByPosition) { @@ -252,7 +252,7 @@ ELSE //如果新表,旧表在一个数据库和模式下,直接修改表名 if (string.Compare(tbname[0], tboldname[0], true) == 0 && string.Compare(tbname[1], tboldname[1], true) == 0) - sbalter.Append("use ").Append(_commonUtils.QuoteSqlName(tbname[0])).Append(_commonUtils.FormatSql(";\r\nEXEC sp_rename {0}, {1};\r\n", _commonUtils.QuoteSqlName($"{tboldname[0]}.{tboldname[1]}.{tboldname[2]}"), tbname[2])); + sbalter.Append("use [").Append(tbname[0]).Append(_commonUtils.FormatSql("];\r\nEXEC sp_rename {0}, {1};\r\n", _commonUtils.QuoteSqlName(tboldname[0], tboldname[1], tboldname[2]), tbname[2])); else { //如果新表,旧表不在一起,创建新表,导入数据,删除旧表 @@ -317,7 +317,7 @@ use [" + database + "];", tboldname ?? tbname); continue; } //添加列 - sbalter.Append("ALTER TABLE ").Append(_commonUtils.QuoteSqlName($"{tbname[0]}.{tbname[1]}.{tbname[2]}")).Append(" ADD ").Append(_commonUtils.QuoteSqlName(tbcol.Attribute.Name)).Append(" ").Append(tbcol.Attribute.DbType); + sbalter.Append("ALTER TABLE ").Append(_commonUtils.QuoteSqlName(tbname[0], tbname[1], tbname[2])).Append(" ADD ").Append(_commonUtils.QuoteSqlName(tbcol.Attribute.Name)).Append(" ").Append(tbcol.Attribute.DbType); if (tbcol.Attribute.IsIdentity == true && tbcol.Attribute.DbType.IndexOf("identity", StringComparison.CurrentCultureIgnoreCase) == -1) sbalter.Append(" identity(1,1)"); if (tbcol.Attribute.IsNullable == false && tbcol.DbDefaultValue != "NULL" && tbcol.Attribute.IsIdentity == false) sbalter.Append(" default(").Append(GetTransferDbDefaultValue(tbcol)).Append(")"); sbalter.Append(";\r\n"); @@ -345,10 +345,10 @@ use [" + database + "];", tboldname ?? tbname); var dsukfind1 = dsuk.Where(a => string.Compare(a[1], uk.Name, true) == 0).ToArray(); if (dsukfind1.Any() == false || dsukfind1.Length != uk.Columns.Length || dsukfind1.Where(a => (a[3] == "1") == uk.IsUnique && uk.Columns.Where(b => string.Compare(b.Column.Attribute.Name, a[0], true) == 0 && (a[2] == "1") == b.IsDesc).Any()).Count() != uk.Columns.Length) { - if (dsukfind1.Any()) sbalter.Append("DROP INDEX ").Append(_commonUtils.QuoteSqlName(uk.Name)).Append(" ON ").Append(_commonUtils.QuoteSqlName($"{tbname[1]}.{tbname[2]}")).Append(";\r\n"); + if (dsukfind1.Any()) sbalter.Append("DROP INDEX ").Append(_commonUtils.QuoteSqlName(uk.Name)).Append(" ON ").Append(_commonUtils.QuoteSqlName(tbname[1], tbname[2])).Append(";\r\n"); sbalter.Append("CREATE "); if (uk.IsUnique) sbalter.Append("UNIQUE "); - sbalter.Append("INDEX ").Append(_commonUtils.QuoteSqlName(uk.Name)).Append(" ON ").Append(_commonUtils.QuoteSqlName($"{tbname[1]}.{tbname[2]}")).Append("("); + sbalter.Append("INDEX ").Append(_commonUtils.QuoteSqlName(uk.Name)).Append(" ON ").Append(_commonUtils.QuoteSqlName(tbname[1], tbname[2])).Append("("); foreach (var tbcol in uk.Columns) { sbalter.Append(_commonUtils.QuoteSqlName(tbcol.Column.Attribute.Name)); @@ -361,18 +361,20 @@ use [" + database + "];", tboldname ?? tbname); } if (istmpatler == false) { - var dbcomment = string.Concat(_orm.Ado.ExecuteScalar(CommandType.Text, $" SELECT value from fn_listextendedproperty('MS_Description', 'schema', N'{tbname[1].Replace("'", "''")}', 'table', N'{tbname[2].Replace("'", "''")}', NULL, NULL)")); + var dbcommentsql = $" SELECT value from fn_listextendedproperty('MS_Description', 'schema', N'{tbname[1].Replace("'", "''")}', 'table', N'{tbname[2].Replace("'", "''")}', NULL, NULL)"; + if (string.Compare(tbname[0], database, true) != 0) dbcommentsql = $"use [{tbname[0]}];{dbcommentsql};use [{database}];"; + var dbcomment = string.Concat(_orm.Ado.ExecuteScalar(CommandType.Text, dbcommentsql)); if (dbcomment != (tb.Comment ?? "")) - AddOrUpdateMS_Description(sb, tbname[1], tbname[2], tb.Comment); + AddOrUpdateMS_Description(sbalter, tbname[1], tbname[2], tb.Comment); if (sbalter.Length > 0) - sb.Append(sbalter).Append("\r\nuse " + database); + sb.Append($"use [{tbname[0]}];").Append(sbalter).Append("\r\nuse [").Append(database).Append("];"); continue; } //创建临时表,数据导进临时表,然后删除原表,将临时表改名为原表名 bool idents = false; - var tablename = tboldname == null ? _commonUtils.QuoteSqlName($"{tbname[0]}.{tbname[1]}.{tbname[2]}") : _commonUtils.QuoteSqlName($"{tboldname[0]}.{tboldname[1]}.{tboldname[2]}"); - var tmptablename = _commonUtils.QuoteSqlName($"{tbname[0]}.{tbname[1]}.FreeSqlTmp_{tbname[2]}"); + var tablename = tboldname == null ? _commonUtils.QuoteSqlName(tbname[0], tbname[1], tbname[2]) : _commonUtils.QuoteSqlName(tboldname[0], tboldname[1], tboldname[2]); + var tmptablename = _commonUtils.QuoteSqlName(tbname[0], tbname[1], $"FreeSqlTmp_{tbname[2]}"); sb.Append("BEGIN TRANSACTION\r\n") .Append("SET QUOTED_IDENTIFIER ON\r\n") .Append("SET ARITHABORT ON\r\n") diff --git a/Providers/FreeSql.Provider.SqlServer/SqlServerCodeFirst.cs b/Providers/FreeSql.Provider.SqlServer/SqlServerCodeFirst.cs index c5f0959e..38e38853 100644 --- a/Providers/FreeSql.Provider.SqlServer/SqlServerCodeFirst.cs +++ b/Providers/FreeSql.Provider.SqlServer/SqlServerCodeFirst.cs @@ -203,8 +203,8 @@ ELSE if (tboldname == null) { //创建表 - var createTableName = _commonUtils.QuoteSqlName($"{tbname[1]}.{tbname[2]}"); - sb.Append("use ").Append(_commonUtils.QuoteSqlName(tbname[0])).Append(";\r\nCREATE TABLE ").Append(createTableName).Append(" ( "); + var createTableName = _commonUtils.QuoteSqlName(tbname[1], tbname[2]); + sb.Append("use [").Append(tbname[0]).Append("];\r\nCREATE TABLE ").Append(createTableName).Append(" ( "); var pkidx = 0; foreach (var tbcol in tb.ColumnsByPosition) { @@ -251,7 +251,7 @@ ELSE //如果新表,旧表在一个数据库和模式下,直接修改表名 if (string.Compare(tbname[0], tboldname[0], true) == 0 && string.Compare(tbname[1], tboldname[1], true) == 0) - sbalter.Append("use ").Append(_commonUtils.QuoteSqlName(tbname[0])).Append(_commonUtils.FormatSql(";\r\nEXEC sp_rename {0}, {1};\r\n", _commonUtils.QuoteSqlName($"{tboldname[0]}.{tboldname[1]}.{tboldname[2]}"), tbname[2])); + sbalter.Append("use [").Append(tbname[0]).Append(_commonUtils.FormatSql("];\r\nEXEC sp_rename {0}, {1};\r\n", _commonUtils.QuoteSqlName(tboldname[0], tboldname[1], tboldname[2]), tbname[2])); else { //如果新表,旧表不在一起,创建新表,导入数据,删除旧表 @@ -316,7 +316,7 @@ use [" + database + "];", tboldname ?? tbname); continue; } //添加列 - sbalter.Append("ALTER TABLE ").Append(_commonUtils.QuoteSqlName($"{tbname[0]}.{tbname[1]}.{tbname[2]}")).Append(" ADD ").Append(_commonUtils.QuoteSqlName(tbcol.Attribute.Name)).Append(" ").Append(tbcol.Attribute.DbType); + sbalter.Append("ALTER TABLE ").Append(_commonUtils.QuoteSqlName(tbname[0], tbname[1], tbname[2])).Append(" ADD ").Append(_commonUtils.QuoteSqlName(tbcol.Attribute.Name)).Append(" ").Append(tbcol.Attribute.DbType); if (tbcol.Attribute.IsIdentity == true && tbcol.Attribute.DbType.IndexOf("identity", StringComparison.CurrentCultureIgnoreCase) == -1) sbalter.Append(" identity(1,1)"); if (tbcol.Attribute.IsNullable == false && tbcol.DbDefaultValue != "NULL" && tbcol.Attribute.IsIdentity == false) sbalter.Append(" default(").Append(GetTransferDbDefaultValue(tbcol)).Append(")"); sbalter.Append(";\r\n"); @@ -344,10 +344,10 @@ use [" + database + "];", tboldname ?? tbname); var dsukfind1 = dsuk.Where(a => string.Compare(a[1], uk.Name, true) == 0).ToArray(); if (dsukfind1.Any() == false || dsukfind1.Length != uk.Columns.Length || dsukfind1.Where(a => (a[3] == "1") == uk.IsUnique && uk.Columns.Where(b => string.Compare(b.Column.Attribute.Name, a[0], true) == 0 && (a[2] == "1") == b.IsDesc).Any()).Count() != uk.Columns.Length) { - if (dsukfind1.Any()) sbalter.Append("DROP INDEX ").Append(_commonUtils.QuoteSqlName(uk.Name)).Append(" ON ").Append(_commonUtils.QuoteSqlName($"{tbname[1]}.{tbname[2]}")).Append(";\r\n"); + if (dsukfind1.Any()) sbalter.Append("DROP INDEX ").Append(_commonUtils.QuoteSqlName(uk.Name)).Append(" ON ").Append(_commonUtils.QuoteSqlName(tbname[1], tbname[2])).Append(";\r\n"); sbalter.Append("CREATE "); if (uk.IsUnique) sbalter.Append("UNIQUE "); - sbalter.Append("INDEX ").Append(_commonUtils.QuoteSqlName(uk.Name)).Append(" ON ").Append(_commonUtils.QuoteSqlName($"{tbname[1]}.{tbname[2]}")).Append("("); + sbalter.Append("INDEX ").Append(_commonUtils.QuoteSqlName(uk.Name)).Append(" ON ").Append(_commonUtils.QuoteSqlName(tbname[1], tbname[2])).Append("("); foreach (var tbcol in uk.Columns) { sbalter.Append(_commonUtils.QuoteSqlName(tbcol.Column.Attribute.Name)); @@ -360,18 +360,20 @@ use [" + database + "];", tboldname ?? tbname); } if (istmpatler == false) { - var dbcomment = string.Concat(_orm.Ado.ExecuteScalar(CommandType.Text, $" SELECT value from fn_listextendedproperty('MS_Description', 'schema', N'{tbname[1].Replace("'", "''")}', 'table', N'{tbname[2].Replace("'", "''")}', NULL, NULL)")); + var dbcommentsql = $" SELECT value from fn_listextendedproperty('MS_Description', 'schema', N'{tbname[1].Replace("'", "''")}', 'table', N'{tbname[2].Replace("'", "''")}', NULL, NULL)"; + if (string.Compare(tbname[0], database, true) != 0) dbcommentsql = $"use [{tbname[0]}];{dbcommentsql};use [{database}];"; + var dbcomment = string.Concat(_orm.Ado.ExecuteScalar(CommandType.Text, dbcommentsql)); if (dbcomment != (tb.Comment ?? "")) - AddOrUpdateMS_Description(sb, tbname[1], tbname[2], tb.Comment); + AddOrUpdateMS_Description(sbalter, tbname[1], tbname[2], tb.Comment); if (sbalter.Length > 0) - sb.Append(sbalter).Append("\r\nuse " + database); + sb.Append($"use [{tbname[0]}];").Append(sbalter).Append("\r\nuse [").Append(database).Append("];"); continue; } //创建临时表,数据导进临时表,然后删除原表,将临时表改名为原表名 bool idents = false; - var tablename = tboldname == null ? _commonUtils.QuoteSqlName($"{tbname[0]}.{tbname[1]}.{tbname[2]}") : _commonUtils.QuoteSqlName($"{tboldname[0]}.{tboldname[1]}.{tboldname[2]}"); - var tmptablename = _commonUtils.QuoteSqlName($"{tbname[0]}.{tbname[1]}.FreeSqlTmp_{tbname[2]}"); + var tablename = tboldname == null ? _commonUtils.QuoteSqlName(tbname[0], tbname[1], tbname[2]) : _commonUtils.QuoteSqlName(tboldname[0], tboldname[1], tboldname[2]); + var tmptablename = _commonUtils.QuoteSqlName(tbname[0], tbname[1], $"FreeSqlTmp_{tbname[2]}"); sb.Append("BEGIN TRANSACTION\r\n") .Append("SET QUOTED_IDENTIFIER ON\r\n") .Append("SET ARITHABORT ON\r\n")