From d54b245ba562e0c47ebb7a8a71cd87f92939f99d Mon Sep 17 00:00:00 2001 From: 28810 <28810@YEXIANGQIN> Date: Tue, 21 May 2019 15:57:19 +0800 Subject: [PATCH] =?UTF-8?q?-=20=E4=BC=98=E5=8C=96=20ICodeFirst.SyncStructu?= =?UTF-8?q?re=20=E9=94=99=E8=AF=AF=E6=8F=90=E7=A4=BA=EF=BC=8C=E5=BD=93?= =?UTF-8?q?=E4=BD=BF=E7=94=A8=E4=B8=8D=E5=8F=AF=E8=BF=81=E7=A7=BB=E5=AE=9E?= =?UTF-8?q?=E4=BD=93=E6=97=B6=EF=BC=9B?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- FreeSql.Tests/UnitTest1.cs | 16 ++++++++++++++++ FreeSql/Internal/UtilsExpressionTree.cs | 2 +- FreeSql/MySql/MySqlCodeFirst.cs | 6 ++++-- FreeSql/Oracle/OracleCodeFirst.cs | 6 ++++-- FreeSql/PostgreSQL/PostgreSQLCodeFirst.cs | 6 ++++-- FreeSql/SqlServer/SqlServerCodeFirst.cs | 6 ++++-- FreeSql/Sqlite/SqliteCodeFirst.cs | 6 ++++-- 7 files changed, 37 insertions(+), 11 deletions(-) diff --git a/FreeSql.Tests/UnitTest1.cs b/FreeSql.Tests/UnitTest1.cs index e2f1c5f5..2217f07a 100644 --- a/FreeSql.Tests/UnitTest1.cs +++ b/FreeSql.Tests/UnitTest1.cs @@ -9,6 +9,7 @@ using NpgsqlTypes; using Npgsql.LegacyPostgis; using System.Linq.Expressions; using System.Threading.Tasks; +using System.Collections; namespace FreeSql.Tests { public class UnitTest1 { @@ -112,9 +113,24 @@ namespace FreeSql.Tests { } + public class TestEnumable : IEnumerable { + public IEnumerator GetEnumerator() { + throw new NotImplementedException(); + } + + IEnumerator IEnumerable.GetEnumerator() { + throw new NotImplementedException(); + } + } + [Fact] public void Test1() { + g.sqlite.CodeFirst.SyncStructure(); + + var TestEnumable = new TestEnumable(); + + g.sqlite.GetRepository().Insert(new Model1 { title = "test_" + DateTime.Now.ToString("yyyyMMddHHmmss"), M2Id = DateTime.Now.Second + DateTime.Now.Minute, diff --git a/FreeSql/Internal/UtilsExpressionTree.cs b/FreeSql/Internal/UtilsExpressionTree.cs index eb5726d5..6fa879d1 100644 --- a/FreeSql/Internal/UtilsExpressionTree.cs +++ b/FreeSql/Internal/UtilsExpressionTree.cs @@ -35,7 +35,7 @@ namespace FreeSql.Internal { var tbc = _cacheGetTableByEntity.GetOrAdd(common._orm.Ado.DataType, k1 => new ConcurrentDictionary()); //区分数据库类型缓存 if (tbc.TryGetValue(entity, out var trytb)) return trytb; if (common.CodeFirst.GetDbInfo(entity) != null) return null; - if (typeof(IEnumerable).IsAssignableFrom(entity)) return null; + if (typeof(IEnumerable).IsAssignableFrom(entity) && entity.IsGenericParameter == true) return null; if (entity.IsArray) return null; var tbattr = common.GetEntityTableAttribute(entity); diff --git a/FreeSql/MySql/MySqlCodeFirst.cs b/FreeSql/MySql/MySqlCodeFirst.cs index 62fa7285..86d0e7db 100644 --- a/FreeSql/MySql/MySqlCodeFirst.cs +++ b/FreeSql/MySql/MySqlCodeFirst.cs @@ -106,6 +106,8 @@ namespace FreeSql.MySql { foreach (var entityType in entityTypes) { if (sb.Length > 0) sb.Append("\r\n"); var tb = _commonUtils.GetTableByEntity(entityType); + if (tb == null) throw new Exception($"类型 {entityType.FullName} 不可迁移"); + if (tb.Columns.Any() == false) throw new Exception($"类型 {entityType.FullName} 不可迁移,可迁移属性0个"); var tbname = tb.DbName.Split(new[] { '.' }, 2); if (tbname?.Length == 1) tbname = new[] { database, tbname[0] }; @@ -126,7 +128,7 @@ namespace FreeSql.MySql { } if (tboldname == null) { //创建表 - sb.Append("CREATE TABLE IF NOT EXISTS ").Append(_commonUtils.QuoteSqlName($"{tbname[0]}.{tbname[1]}")).Append(" ("); + sb.Append("CREATE TABLE IF NOT EXISTS ").Append(_commonUtils.QuoteSqlName($"{tbname[0]}.{tbname[1]}")).Append(" ( "); foreach (var tbcol in tb.Columns.Values) { sb.Append(" \r\n ").Append(_commonUtils.QuoteSqlName(tbcol.Attribute.Name)).Append(" "); sb.Append(tbcol.Attribute.DbType); @@ -233,7 +235,7 @@ where a.constraint_schema IN ({0}) and a.table_name IN ({1})", tboldname ?? tbna var tablename = tboldname == null ? _commonUtils.QuoteSqlName($"{tbname[0]}.{tbname[1]}") : _commonUtils.QuoteSqlName($"{tboldname[0]}.{tboldname[1]}"); var tmptablename = _commonUtils.QuoteSqlName($"{tbname[0]}.FreeSqlTmp_{tbname[1]}"); //创建临时表 - sb.Append("CREATE TABLE IF NOT EXISTS ").Append(tmptablename).Append(" ("); + sb.Append("CREATE TABLE IF NOT EXISTS ").Append(tmptablename).Append(" ( "); foreach (var tbcol in tb.Columns.Values) { sb.Append(" \r\n ").Append(_commonUtils.QuoteSqlName(tbcol.Attribute.Name)).Append(" "); sb.Append(tbcol.Attribute.DbType); diff --git a/FreeSql/Oracle/OracleCodeFirst.cs b/FreeSql/Oracle/OracleCodeFirst.cs index 16de5b60..9209933e 100644 --- a/FreeSql/Oracle/OracleCodeFirst.cs +++ b/FreeSql/Oracle/OracleCodeFirst.cs @@ -88,6 +88,8 @@ namespace FreeSql.Oracle { foreach (var entityType in entityTypes) { if (sb.Length > 0) sb.Append("\r\n"); var tb = _commonUtils.GetTableByEntity(entityType); + if (tb == null) throw new Exception($"类型 {entityType.FullName} 不可迁移"); + if (tb.Columns.Any() == false) throw new Exception($"类型 {entityType.FullName} 不可迁移,可迁移属性0个"); var tbname = tb.DbName.Split(new[] { '.' }, 2); if (tbname?.Length == 1) tbname = new[] { userId, tbname[0] }; @@ -107,7 +109,7 @@ namespace FreeSql.Oracle { } if (tboldname == null) { //创建表 - sb.Append("execute immediate 'CREATE TABLE ").Append(_commonUtils.QuoteSqlName($"{tbname[0]}.{tbname[1]}")).Append(" ("); + sb.Append("execute immediate 'CREATE TABLE ").Append(_commonUtils.QuoteSqlName($"{tbname[0]}.{tbname[1]}")).Append(" ( "); foreach (var tbcol in tb.Columns.Values) { sb.Append(" \r\n ").Append(_commonUtils.QuoteSqlName(tbcol.Attribute.Name)).Append(" ").Append(tbcol.Attribute.DbType).Append(","); if (tbcol.Attribute.IsIdentity == true) seqcols.Add((tbcol, tbname, true)); @@ -226,7 +228,7 @@ and a.owner in ({0}) and a.table_name in ({1})", tboldname ?? tbname); var tablename = tboldname == null ? _commonUtils.QuoteSqlName($"{tbname[0]}.{tbname[1]}") : _commonUtils.QuoteSqlName($"{tboldname[0]}.{tboldname[1]}"); var tmptablename = _commonUtils.QuoteSqlName($"{tbname[0]}.FTmp_{tbname[1]}"); //创建临时表 - sb.Append("execute immediate 'CREATE TABLE ").Append(tmptablename).Append(" ("); + sb.Append("execute immediate 'CREATE TABLE ").Append(tmptablename).Append(" ( "); foreach (var tbcol in tb.Columns.Values) { sb.Append(" \r\n ").Append(_commonUtils.QuoteSqlName(tbcol.Attribute.Name)).Append(" ").Append(tbcol.Attribute.DbType).Append(","); if (tbcol.Attribute.IsIdentity == true) seqcols.Add((tbcol, tbname, true)); diff --git a/FreeSql/PostgreSQL/PostgreSQLCodeFirst.cs b/FreeSql/PostgreSQL/PostgreSQLCodeFirst.cs index 0b927c09..0c7da3c5 100644 --- a/FreeSql/PostgreSQL/PostgreSQLCodeFirst.cs +++ b/FreeSql/PostgreSQL/PostgreSQLCodeFirst.cs @@ -131,6 +131,8 @@ namespace FreeSql.PostgreSQL { foreach (var entityType in entityTypes) { if (sb.Length > 0) sb.Append("\r\n"); var tb = _commonUtils.GetTableByEntity(entityType); + if (tb == null) throw new Exception($"类型 {entityType.FullName} 不可迁移"); + if (tb.Columns.Any() == false) throw new Exception($"类型 {entityType.FullName} 不可迁移,可迁移属性0个"); var tbname = tb.DbName.Split(new[] { '.' }, 2); if (tbname?.Length == 1) tbname = new[] { "public", tbname[0] }; @@ -150,7 +152,7 @@ namespace FreeSql.PostgreSQL { } if (tboldname == null) { //创建表 - sb.Append("CREATE TABLE IF NOT EXISTS ").Append(_commonUtils.QuoteSqlName($"{tbname[0]}.{tbname[1]}")).Append(" ("); + sb.Append("CREATE TABLE IF NOT EXISTS ").Append(_commonUtils.QuoteSqlName($"{tbname[0]}.{tbname[1]}")).Append(" ( "); foreach (var tbcol in tb.Columns.Values) { sb.Append(" \r\n ").Append(_commonUtils.QuoteSqlName(tbcol.Attribute.Name)).Append(" ").Append(tbcol.Attribute.DbType).Append(","); if (tbcol.Attribute.IsIdentity == true) seqcols.Add((tbcol, tbname, true)); @@ -283,7 +285,7 @@ where pg_namespace.nspname={0} and pg_class.relname={1} and pg_constraint.contyp var tablename = tboldname == null ? _commonUtils.QuoteSqlName($"{tbname[0]}.{tbname[1]}") : _commonUtils.QuoteSqlName($"{tboldname[0]}.{tboldname[1]}"); var tmptablename = _commonUtils.QuoteSqlName($"{tbname[0]}.FreeSqlTmp_{tbname[1]}"); //创建临时表 - sb.Append("CREATE TABLE IF NOT EXISTS ").Append(tmptablename).Append(" ("); + sb.Append("CREATE TABLE IF NOT EXISTS ").Append(tmptablename).Append(" ( "); foreach (var tbcol in tb.Columns.Values) { sb.Append(" \r\n ").Append(_commonUtils.QuoteSqlName(tbcol.Attribute.Name)).Append(" ").Append(tbcol.Attribute.DbType).Append(","); if (tbcol.Attribute.IsIdentity == true) seqcols.Add((tbcol, tbname, true)); diff --git a/FreeSql/SqlServer/SqlServerCodeFirst.cs b/FreeSql/SqlServer/SqlServerCodeFirst.cs index b6997a74..4fb6cf4b 100644 --- a/FreeSql/SqlServer/SqlServerCodeFirst.cs +++ b/FreeSql/SqlServer/SqlServerCodeFirst.cs @@ -98,6 +98,8 @@ namespace FreeSql.SqlServer { foreach (var entityType in entityTypes) { if (sb.Length > 0) sb.Append("\r\n"); var tb = _commonUtils.GetTableByEntity(entityType); + if (tb == null) throw new Exception($"类型 {entityType.FullName} 不可迁移"); + if (tb.Columns.Any() == false) throw new Exception($"类型 {entityType.FullName} 不可迁移,可迁移属性0个"); var tbname = tb.DbName.Split(new[] { '.' }, 3); if (tbname?.Length == 1) tbname = new[] { database, "dbo", tbname[0] }; if (tbname?.Length == 2) tbname = new[] { database, tbname[0], tbname[1] }; @@ -123,7 +125,7 @@ namespace FreeSql.SqlServer { } if (tboldname == null) { //创建新表 - sb.Append("use ").Append(_commonUtils.QuoteSqlName(tbname[0])).Append(";\r\nCREATE TABLE ").Append(_commonUtils.QuoteSqlName($"{tbname[1]}.{tbname[2]}")).Append(" ("); + sb.Append("use ").Append(_commonUtils.QuoteSqlName(tbname[0])).Append(";\r\nCREATE TABLE ").Append(_commonUtils.QuoteSqlName($"{tbname[1]}.{tbname[2]}")).Append(" ( "); var pkidx = 0; foreach (var tbcol in tb.Columns.Values) { sb.Append(" \r\n ").Append(_commonUtils.QuoteSqlName(tbcol.Attribute.Name)).Append(" "); @@ -254,7 +256,7 @@ use " + database, tboldname ?? tbname); .Append("COMMIT\r\n"); sb.Append("BEGIN TRANSACTION;\r\n"); //创建临时表 - sb.Append("CREATE TABLE ").Append(tmptablename).Append(" ("); + sb.Append("CREATE TABLE ").Append(tmptablename).Append(" ( "); var pkidx2 = 0; foreach (var tbcol in tb.Columns.Values) { sb.Append(" \r\n ").Append(_commonUtils.QuoteSqlName(tbcol.Attribute.Name)).Append(" "); diff --git a/FreeSql/Sqlite/SqliteCodeFirst.cs b/FreeSql/Sqlite/SqliteCodeFirst.cs index b4756b1e..930580e6 100644 --- a/FreeSql/Sqlite/SqliteCodeFirst.cs +++ b/FreeSql/Sqlite/SqliteCodeFirst.cs @@ -83,6 +83,8 @@ namespace FreeSql.Sqlite { foreach (var entityType in entityTypes) { if (sb.Length > 0) sb.Append("\r\n"); var tb = _commonUtils.GetTableByEntity(entityType); + if (tb == null) throw new Exception($"类型 {entityType.FullName} 不可迁移"); + if (tb.Columns.Any() == false) throw new Exception($"类型 {entityType.FullName} 不可迁移,可迁移属性0个"); var tbname = tb.DbName.Split(new[] { '.' }, 2); if (tbname?.Length == 1) tbname = new[] { "main", tbname[0] }; @@ -100,7 +102,7 @@ namespace FreeSql.Sqlite { } if (tboldname == null) { //创建表 - sb.Append("CREATE TABLE IF NOT EXISTS ").Append(_commonUtils.QuoteSqlName($"{tbname[0]}.{tbname[1]}")).Append(" ("); + sb.Append("CREATE TABLE IF NOT EXISTS ").Append(_commonUtils.QuoteSqlName($"{tbname[0]}.{tbname[1]}")).Append(" ( "); foreach (var tbcol in tb.Columns.Values) { sb.Append(" \r\n ").Append(_commonUtils.QuoteSqlName(tbcol.Attribute.Name)).Append(" "); sb.Append(tbcol.Attribute.DbType); @@ -200,7 +202,7 @@ namespace FreeSql.Sqlite { //创建临时表 //创建表 isIndent = false; - sb.Append("CREATE TABLE IF NOT EXISTS ").Append(tmptablename).Append(" ("); + sb.Append("CREATE TABLE IF NOT EXISTS ").Append(tmptablename).Append(" ( "); foreach (var tbcol in tb.Columns.Values) { sb.Append(" \r\n ").Append(_commonUtils.QuoteSqlName(tbcol.Attribute.Name)).Append(" "); sb.Append(tbcol.Attribute.DbType);