From 91b652c19166ab5713bd12935676083ad2b094a3 Mon Sep 17 00:00:00 2001
From: 28810 <28810@YEXIANGQIN>
Date: Wed, 10 Jun 2020 15:17:58 +0800
Subject: [PATCH] =?UTF-8?q?-=20=E5=AE=8C=E6=88=90=20=E7=A5=9E=E9=80=9A?=
=?UTF-8?q?=E6=95=B0=E6=8D=AE=E5=BA=93=E6=89=80=E6=9C=89=E9=80=82=E9=85=8D?=
=?UTF-8?q?=EF=BC=9B?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
FreeSql.DbContext/FreeSql.DbContext.xml | 16 +++
.../ShenTong/ShenTongDbFirstTest.cs | 2 +-
FreeSql/FreeSql.xml | 2 +-
Providers/FreeSql.Provider.Odbc/readme.md | 2 +-
.../ShenTongDbFirst.cs | 107 ++++++------------
.../ShenTongProvider.cs | 4 +-
6 files changed, 57 insertions(+), 76 deletions(-)
diff --git a/FreeSql.DbContext/FreeSql.DbContext.xml b/FreeSql.DbContext/FreeSql.DbContext.xml
index 132d875e..4854f49c 100644
--- a/FreeSql.DbContext/FreeSql.DbContext.xml
+++ b/FreeSql.DbContext/FreeSql.DbContext.xml
@@ -125,6 +125,13 @@
清空状态数据
+
+
+ 根据 lambda 条件删除数据
+
+
+
+
添加
@@ -479,5 +486,14 @@
+
+
+ 批量注入 Repository,可以参考代码自行调整
+
+
+
+
+
+
diff --git a/FreeSql.Tests/FreeSql.Tests/ShenTong/ShenTongDbFirstTest.cs b/FreeSql.Tests/FreeSql.Tests/ShenTong/ShenTongDbFirstTest.cs
index e331b44a..c7d757f5 100644
--- a/FreeSql.Tests/FreeSql.Tests/ShenTong/ShenTongDbFirstTest.cs
+++ b/FreeSql.Tests/FreeSql.Tests/ShenTong/ShenTongDbFirstTest.cs
@@ -18,7 +18,7 @@ namespace FreeSql.Tests.ShenTong
public void GetTablesByDatabase()
{
- var t2 = g.shentong.DbFirst.GetTablesByDatabase(g.shentong.DbFirst.GetDatabases()[1]);
+ var t2 = g.shentong.DbFirst.GetTablesByDatabase(g.shentong.DbFirst.GetDatabases()[0]);
}
}
diff --git a/FreeSql/FreeSql.xml b/FreeSql/FreeSql.xml
index a029e482..7f3b7221 100644
--- a/FreeSql/FreeSql.xml
+++ b/FreeSql/FreeSql.xml
@@ -1373,7 +1373,7 @@
Sqlite: 无效果
达梦: for update nowait
人大金仓: for update nowait
- 神通: for update nowait
+ 神通: for update
noawait
diff --git a/Providers/FreeSql.Provider.Odbc/readme.md b/Providers/FreeSql.Provider.Odbc/readme.md
index 68529582..dc698f7c 100644
--- a/Providers/FreeSql.Provider.Odbc/readme.md
+++ b/Providers/FreeSql.Provider.Odbc/readme.md
@@ -1,6 +1,6 @@
FreeSql.Provider.Odbc 实现 ODBC 访问数据库,ODBC 属于比较原始的技术,更新慢,各大数据库厂支持得标准不一,不到万不得已最好别用 odbc,坑比较多。
-FreeSql.Provider.Odbc 做了四种数据库的专用实现:SqlServer、PostgreSQL、Oracle、MySql,和一种通用实现。
+FreeSql.Provider.Odbc 做了四种数据库的专用实现:SqlServer、PostgreSQL、Oracle、MySql、达梦、人大金仓,和一种通用实现。
专用实现比较有针对性,和原来的 FreeSql.Provider.SqlServer ado.net 相比,只支持较少的基础类型,其他功能几乎都有,包括 CodeFirst 自动迁移。
diff --git a/Providers/FreeSql.Provider.ShenTong/ShenTongDbFirst.cs b/Providers/FreeSql.Provider.ShenTong/ShenTongDbFirst.cs
index dcea104e..a79c01ae 100644
--- a/Providers/FreeSql.Provider.ShenTong/ShenTongDbFirst.cs
+++ b/Providers/FreeSql.Provider.ShenTong/ShenTongDbFirst.cs
@@ -143,17 +143,16 @@ namespace FreeSql.ShenTong
var sql = $@"
select
-b.nspname || '.' || a.tablename,
-a.schemaname,
-a.tablename ,
+b.nspname || '.' || a.relname,
+b.nspname,
+a.relname,
d.description,
'TABLE'
-from sys_tables a
-inner join sys_namespace b on b.nspname = a.schemaname
-inner join sys_class c on c.relnamespace = b.oid and c.relname = a.tablename
-left join sys_description d on d.objoid = c.oid and objsubid = 0
-where a.schemaname not in ('DIRECTORIES', 'INFO_SCHEM', 'REPLICATION', 'STAGENT', 'SYSAUDIT', 'SYSDBA', 'SYSFTSDBA', 'SYSSECURE', 'SYS_GLOBAL_TEMP', 'WMSYS')
-and b.nspname || '.' || a.tablename not in ('PUBLIC.SPATIAL_REF_SYS')
+from sys_class a
+inner join sys_namespace b on b.oid = a.relnamespace
+left join sys_description d on d.objoid = a.oid and objsubid = 0
+where b.nspname not in ('DIRECTORIES', 'INFO_SCHEM', 'REPLICATION', 'STAGENT', 'SYSAUDIT', 'SYSDBA', 'SYSFTSDBA', 'SYSSECURE', 'SYS_GLOBAL_TEMP', 'WMSYS') and a.relkind in ('r')
+and b.nspname || '.' || a.relname not in ('PUBLIC.SPATIAL_REF_SYS')
union all
@@ -167,7 +166,7 @@ from sys_class a
inner join sys_namespace b on b.oid = a.relnamespace
left join sys_description d on d.objoid = a.oid and objsubid = 0
where b.nspname not in ('DIRECTORIES', 'INFO_SCHEM', 'REPLICATION', 'STAGENT', 'SYSAUDIT', 'SYSDBA', 'SYSFTSDBA', 'SYSSECURE', 'SYS_GLOBAL_TEMP', 'WMSYS') and a.relkind in ('m','v')
-and b.nspname || '.' || a.relname not in ('PUBLIC.GEOGRAPHY_COLUMNS','PUBLIC.GEOMETRY_COLUMNS','PUBLIC.RASTER_COLUMNS','PUBLIC.RASTER_OVERVIEWS')
+and b.nspname || '.' || a.relname not in ('PUBLIC.GEOGRAPHY_COLUMNS','PUBLIC.GEOMETRY_COLUMNS','PUBLIC.RASTER_COLUMNS','PUBLIC.RASTER_OVERVIEWS','PUBLIC.DBA_JOBS')
";
var ds = _orm.Ado.ExecuteArray(CommandType.Text, sql);
if (ds == null) return loc1;
@@ -260,7 +259,7 @@ where {loc8.ToString().Replace("a.table_name", "ns.nspname || '.' || c.relname")
var max_length = int.Parse(string.Concat(row[3]));
var sqlType = string.Concat(row[4]);
var is_nullable = string.Concat(row[5]) == "1";
- var is_identity = string.Concat(row[6]).StartsWith(@"NEXTVAL('") && string.Concat(row[6]).EndsWith(@"'::REGCLASS)");
+ var is_identity = string.Concat(row[6]).StartsWith(@"NEXTVAL('") && string.Concat(row[6]).EndsWith(@"'::text)");
var comment = string.Concat(row[7]);
var defaultValue = string.Concat(row[6]);
int attndims = int.Parse(string.Concat(row[8]));
@@ -314,8 +313,9 @@ b.relname as index_id,
case when a.indisunique then 1 else 0 end IsUnique,
case when a.indisprimary then 1 else 0 end IsPrimary,
case when a.indisclustered then 0 else 1 end IsClustered,
-case when sys_index_column_has_property(b.oid, c.attnum, 'desc') = 't' then 1 else 0 end IsDesc,
-a.indkey::text,
+--case when sys_index_column_has_property(b.oid, c.attnum, 'desc') = 't' then 1 else 0 end IsDesc,
+0,
+a.indkey,
c.attnum
from sys_index a
inner join sys_class b on b.oid = a.indexrelid
@@ -385,50 +385,41 @@ where {loc8.ToString().Replace("a.table_name", "ns.nspname || '.' || d.relname")
sql = $@"
select
-ns.nspname || '.' || b.relname as table_id,
-array(select attname from sys_attribute where attrelid = a.conrelid and attnum = any(a.conkey)) as column_name,
-a.conname as FKId,
-ns2.nspname || '.' || c.relname as ref_table_id,
-1 as IsForeignKey,
-array(select attname from sys_attribute where attrelid = a.confrelid and attnum = any(a.confkey)) as ref_column,
-null ref_sln,
-null ref_table
-from sys_constraint a
-inner join sys_class b on b.oid = a.conrelid
-inner join sys_class c on c.oid = a.confrelid
-inner join sys_namespace ns on ns.oid = b.relnamespace
-inner join sys_namespace ns2 on ns2.oid = c.relnamespace
-where {loc8.ToString().Replace("a.table_name", "ns.nspname || '.' || b.relname")}
+a.pktable_schem || '.' || a.pktable_name,
+a.pkcolumn_name,
+a.fk_name,
+a.fktable_schem || '.' || a.fktable_name,
+1,
+a.fkcolumn_name
+from v_sys_foreign_keys a
+where {loc8.ToString().Replace("a.table_name", "a.pktable_schem || '.' || a.pktable_name")}
";
ds = _orm.Ado.ExecuteArray(CommandType.Text, sql);
if (ds == null) return loc1;
var fkColumns = new Dictionary>();
- foreach (object[] row in ds)
+ foreach (var row in ds)
{
- var table_id = string.Concat(row[0]);
- var column = row[1] as string[];
- var fk_id = string.Concat(row[2]);
- var ref_table_id = string.Concat(row[3]);
- var is_foreign_key = string.Concat(row[4]) == "1";
- var referenced_column = row[5] as string[];
- var referenced_db = string.Concat(row[6]);
- var referenced_table = string.Concat(row[7]);
-
+ string table_id = string.Concat(row[0]);
+ string column = string.Concat(row[1]);
+ string fk_id = string.Concat(row[2]);
+ string ref_table_id = string.Concat(row[3]);
+ bool is_foreign_key = string.Concat(row[4]) == "1";
+ string referenced_column = string.Concat(row[5]);
+ if (loc3.ContainsKey(table_id) == false || loc3[table_id].ContainsKey(column) == false) continue;
+ var loc9 = loc3[table_id][column];
if (loc2.ContainsKey(ref_table_id) == false) continue;
+ var loc10 = loc2[ref_table_id];
+ var loc11 = loc3[ref_table_id][referenced_column];
Dictionary loc12 = null;
DbForeignInfo loc13 = null;
if (!fkColumns.TryGetValue(table_id, out loc12))
fkColumns.Add(table_id, loc12 = new Dictionary());
if (!loc12.TryGetValue(fk_id, out loc13))
- loc12.Add(fk_id, loc13 = new DbForeignInfo { Table = loc2[table_id], ReferencedTable = loc2[ref_table_id] });
-
- for (int a = 0; a < column.Length; a++)
- {
- loc13.Columns.Add(loc3[table_id][column[a]]);
- loc13.ReferencedColumns.Add(loc3[ref_table_id][referenced_column[a]]);
- }
+ loc12.Add(fk_id, loc13 = new DbForeignInfo { Table = loc2[table_id], ReferencedTable = loc10 });
+ loc13.Columns.Add(loc9);
+ loc13.ReferencedColumns.Add(loc11);
}
foreach (var table_id in fkColumns.Keys)
foreach (var fk in fkColumns[table_id])
@@ -482,32 +473,6 @@ where {loc8.ToString().Replace("a.table_name", "ns.nspname || '.' || b.relname")
return tables;
}
- public class GetEnumsByDatabaseQueryInfo
- {
- public string name { get; set; }
- public string label { get; set; }
- }
- public List GetEnumsByDatabase(params string[] database)
- {
- if (database == null || database.Length == 0) return new List();
- var drs = _orm.Ado.Query(CommandType.Text, _commonUtils.FormatSql(@"
-select
-ns.nspname || '.' || a.typname AS name,
-b.enumlabel AS label
-from sys_type a
-inner join sys_enum b on b.enumtypid = a.oid
-inner join sys_namespace ns on ns.oid = a.typnamespace
-where a.typtype = 'e' and ns.nspname in (SELECT schema_name FROM information_schema.schemata where catalog_name in {0})", database));
- var ret = new Dictionary>();
- foreach (var dr in drs)
- {
- if (ret.TryGetValue(dr.name, out var labels) == false) ret.Add(dr.name, labels = new Dictionary());
- var key = dr.label;
- if (Regex.IsMatch(key, @"^[\u0391-\uFFE5a-zA-Z_\$][\u0391-\uFFE5a-zA-Z_\$\d]*$") == false)
- key = $"Unkown{ret[dr.name].Count + 1}";
- if (labels.ContainsKey(key) == false) labels.Add(key, dr.label);
- }
- return ret.Select(a => new DbEnumInfo { Name = a.Key, Labels = a.Value }).ToList();
- }
+ public List GetEnumsByDatabase(params string[] database) => new List();
}
}
\ No newline at end of file
diff --git a/Providers/FreeSql.Provider.ShenTong/ShenTongProvider.cs b/Providers/FreeSql.Provider.ShenTong/ShenTongProvider.cs
index 25f30f08..7258038d 100644
--- a/Providers/FreeSql.Provider.ShenTong/ShenTongProvider.cs
+++ b/Providers/FreeSql.Provider.ShenTong/ShenTongProvider.cs
@@ -32,7 +32,7 @@ namespace FreeSql.ShenTong
public IAdo Ado { get; }
public IAop Aop { get; }
public ICodeFirst CodeFirst { get; }
- public IDbFirst DbFirst => throw new NotImplementedException("正在支持中");
+ public IDbFirst DbFirst { get; }
public ShenTongProvider(string masterConnectionString, string[] slaveConnectionString, Func connectionFactory = null)
{
this.InternalCommonUtils = new ShenTongUtils(this);
@@ -41,7 +41,7 @@ namespace FreeSql.ShenTong
this.Ado = new ShenTongAdo(this.InternalCommonUtils, masterConnectionString, slaveConnectionString, connectionFactory);
this.Aop = new AopProvider();
- //this.DbFirst = new ShenTongDbFirst(this, this.InternalCommonUtils, this.InternalCommonExpression);
+ this.DbFirst = new ShenTongDbFirst(this, this.InternalCommonUtils, this.InternalCommonExpression);
this.CodeFirst = new ShenTongCodeFirst(this, this.InternalCommonUtils, this.InternalCommonExpression);
}