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")