- 修复 Oracle Dbfirst 字段可空、和主键判断的 bug;

This commit is contained in:
28810 2019-12-12 18:03:32 +08:00
parent a9512745d8
commit 801b9ba082
3 changed files with 183 additions and 163 deletions

View File

@ -2267,7 +2267,181 @@
<member name="P:FreeSql.IAop.SyncStructureAfter"> <member name="P:FreeSql.IAop.SyncStructureAfter">
<summary> <summary>
CodeFirst迁移执行完成触发 CodeFirst迁移执行完成触发
</sum"P:FreeSql.ICodeFirst.IsNoneCommandParameter"> </summary>
</member>
<member name="P:FreeSql.IAop.AuditValue">
<summary>
Insert/Update自动值处理
</summary>
</member>
<member name="P:FreeSql.Aop.ParseExpressionEventArgs.FreeParse">
<summary>
内置解析功能,可辅助您进行解析
</summary>
</member>
<member name="P:FreeSql.Aop.ParseExpressionEventArgs.Expression">
<summary>
需要您解析的表达式
</summary>
</member>
<member name="P:FreeSql.Aop.ParseExpressionEventArgs.Result">
<summary>
解析后的内容
</summary>
</member>
<member name="P:FreeSql.Aop.ConfigEntityEventArgs.EntityType">
<summary>
实体类型
</summary>
</member>
<member name="P:FreeSql.Aop.ConfigEntityEventArgs.ModifyResult">
<summary>
实体配置
</summary>
</member>
<member name="P:FreeSql.Aop.ConfigEntityEventArgs.ModifyIndexResult">
<summary>
索引配置
</summary>
</member>
<member name="P:FreeSql.Aop.ConfigEntityPropertyEventArgs.EntityType">
<summary>
实体类型
</summary>
</member>
<member name="P:FreeSql.Aop.ConfigEntityPropertyEventArgs.Property">
<summary>
实体的属性
</summary>
</member>
<member name="P:FreeSql.Aop.ConfigEntityPropertyEventArgs.ModifyResult">
<summary>
实体的属性配置
</summary>
</member>
<member name="P:FreeSql.Aop.CurdBeforeEventArgs.Identifier">
<summary>
标识符,可将 CurdBefore 与 CurdAfter 进行匹配
</summary>
</member>
<member name="P:FreeSql.Aop.CurdBeforeEventArgs.CurdType">
<summary>
操作类型
</summary>
</member>
<member name="P:FreeSql.Aop.CurdBeforeEventArgs.EntityType">
<summary>
实体类型
</summary>
</member>
<member name="P:FreeSql.Aop.CurdBeforeEventArgs.Table">
<summary>
实体类型的元数据
</summary>
</member>
<member name="P:FreeSql.Aop.CurdBeforeEventArgs.Sql">
<summary>
执行的 SQL
</summary>
</member>
<member name="P:FreeSql.Aop.CurdBeforeEventArgs.DbParms">
<summary>
参数化命令
</summary>
</member>
<member name="P:FreeSql.Aop.CurdAfterEventArgs.Exception">
<summary>
发生的错误
</summary>
</member>
<member name="P:FreeSql.Aop.CurdAfterEventArgs.ExecuteResult">
<summary>
执行SQL命令返回的结果
</summary>
</member>
<member name="P:FreeSql.Aop.CurdAfterEventArgs.ElapsedTicks">
<summary>
耗时单位Ticks
</summary>
</member>
<member name="P:FreeSql.Aop.CurdAfterEventArgs.ElapsedMilliseconds">
<summary>
耗时(单位:毫秒)
</summary>
</member>
<member name="P:FreeSql.Aop.SyncStructureBeforeEventArgs.Identifier">
<summary>
标识符,可将 SyncStructureBeforeEventArgs 与 SyncStructureAfterEventArgs 进行匹配
</summary>
</member>
<member name="P:FreeSql.Aop.SyncStructureBeforeEventArgs.EntityTypes">
<summary>
实体类型
</summary>
</member>
<member name="P:FreeSql.Aop.SyncStructureAfterEventArgs.Sql">
<summary>
执行的 SQL
</summary>
</member>
<member name="P:FreeSql.Aop.SyncStructureAfterEventArgs.Exception">
<summary>
发生的错误
</summary>
</member>
<member name="P:FreeSql.Aop.SyncStructureAfterEventArgs.ElapsedTicks">
<summary>
耗时单位Ticks
</summary>
</member>
<member name="P:FreeSql.Aop.SyncStructureAfterEventArgs.ElapsedMilliseconds">
<summary>
耗时(单位:毫秒)
</summary>
</member>
<member name="P:FreeSql.Aop.AuditValueEventArgs.AuditValueType">
<summary>
类型
</summary>
</member>
<member name="P:FreeSql.Aop.AuditValueEventArgs.Column">
<summary>
属性列的元数据
</summary>
</member>
<member name="P:FreeSql.Aop.AuditValueEventArgs.Property">
<summary>
反射的属性信息
</summary>
</member>
<member name="P:FreeSql.Aop.AuditValueEventArgs.Value">
<summary>
获取实体的属性值,也可以设置实体的属性新值
</summary>
</member>
<member name="P:FreeSql.ICodeFirst.IsAutoSyncStructure">
<summary>
【开发环境必备】自动同步实体结构到数据库,程序运行中检查实体表是否存在,然后创建或修改
</summary>
</member>
<member name="P:FreeSql.ICodeFirst.IsSyncStructureToLower">
<summary>
转小写同步结构
</summary>
</member>
<member name="P:FreeSql.ICodeFirst.IsSyncStructureToUpper">
<summary>
转大写同步结构
</summary>
</member>
<member name="P:FreeSql.ICodeFirst.IsConfigEntityFromDbFirst">
<summary>
将数据库的主键、自增、索引设置导入,适用 DbFirst 模式,无须在实体类型上设置 [Column(IsPrimary)] 或者 ConfigEntity。此功能目前可用于 mysql/sqlserver/postgresql/oracle。<para></para>
本功能会影响 IFreeSql 首次访问的速度。<para></para>
若使用 CodeFirst 创建索引后,又直接在数据库上建了索引,若无本功能下一次 CodeFirst 迁移时数据库上创建的索引将被删除
</summary>
</member>
<member name="P:FreeSql.ICodeFirst.IsNoneCommandParameter">
<summary> <summary>
不使用命令参数化执行,针对 Insert/Update 不使用命令参数化执行,针对 Insert/Update
</summary> </summary>
@ -2818,160 +2992,6 @@
CodeFirst 模式开发相关方法 CodeFirst 模式开发相关方法
</summary> </summary>
</member> </member>
<member name="P:IFreeSql.DbFirst">
<summary>
DbFirst 模式开发相关方法
</summary>
<
<typeparam name="T"></typeparam>
<param name="exp1"></param>
<param name="condition">true 时生效</param>
<param name="exp2"></param>
<returns></returns>
</member>
<member name="M:System.Linq.Expressions.LambadaExpressionExtensions.Or``1(System.Linq.Expressions.Expression{System.Func{``0,System.Boolean}},System.Linq.Expressions.Expression{System.Func{``0,System.Boolean}})">
<summary>
使用 or 拼接两个 lambda 表达式
</summary>
<returns></returns>
</member>
<member name="M:System.Linq.Expressions.LambadaExpressionExtensions.Or``1(System.Linq.Expressions.Expression{System.Func{``0,System.Boolean}},System.Boolean,System.Linq.Expressions.Expression{System.Func{``0,System.Boolean}})">
<summary>
使用 or 拼接两个 lambda 表达式
</summary>
<typeparam name="T"></typeparam>
<param name="exp1"></param>
<param name="condition">true 时生效</param>
<param name="exp2"></param>
<returns></returns>
</member>
<member name="M:System.Linq.Expressions.LambadaExpressionExtensions.Not``1(System.Linq.Expressions.Expression{System.Func{``0,System.Boolean}},System.Boolean)">
<summary>
将 lambda 表达式取反
</summary>
<typeparam name="T"></typeparam>
<param name="exp"></param>
<param name="condition">true 时生效</param>
<returns></returns>
</member>
<member name="M:FreeUtil.NewMongodbId">
<summary>
生成类似Mongodb的ObjectId有序、不重复Guid
</summary>
<returns></returns>
</member>
<member name="M:IFreeSql.Insert``1">
<summary>
插入数据
</summary>
<typeparam name="T1"></typeparam>
<returns></returns>
</member>
<member name="M:IFreeSql.Insert``1(``0)">
<summary>
插入数据,传入实体
</summary>
<typeparam name="T1"></typeparam>
<param name="source"></param>
<returns></returns>
</member>
<member name="M:IFreeSql.Insert``1(``0[])">
<summary>
插入数据,传入实体数组
</summary>
<typeparam name="T1"></typeparam>
<param name="source"></param>
<returns></returns>
</member>
<member name="M:IFreeSql.Insert``1(System.Collections.Generic.List{``0})">
<summary>
插入数据,传入实体集合
</summary>
<typeparam name="T1"></typeparam>
<param name="source"></param>
<returns></returns>
</member>
<member name="M:IFreeSql.Insert``1(System.Collections.Generic.IEnumerable{``0})">
<summary>
插入数据,传入实体集合
</summary>
<typeparam name="T1"></typeparam>
<param name="source"></param>
<returns></returns>
</member>
<member name="M:IFreeSql.Update``1">
<summary>
修改数据
</summary>
<typeparam name="T1"></typeparam>
<returns></returns>
</member>
<member name="M:IFreeSql.Update``1(System.Object)">
<summary>
修改数据,传入动态对象如:主键值 | new[]{主键值1,主键值2} | TEntity1 | new[]{TEntity1,TEntity2} | new{id=1}
</summary>
<typeparam name="T1"></typeparam>
<param name="dywhere">主键值、主键值集合、实体、实体集合、匿名对象、匿名对象集合</param>
<returns></returns>
</member>
<member name="M:IFreeSql.Select``1">
<summary>
查询数据
</summary>
<typeparam name="T1"></typeparam>
<returns></returns>
</member>
<member name="M:IFreeSql.Select``1(System.Object)">
<summary>
查询数据,传入动态对象如:主键值 | new[]{主键值1,主键值2} | TEntity1 | new[]{TEntity1,TEntity2} | new{id=1}
</summary>
<typeparam name="T1"></typeparam>
<param name="dywhere">主键值、主键值集合、实体、实体集合、匿名对象、匿名对象集合</param>
<returns></returns>
</member>
<member name="M:IFreeSql.Delete``1">
<summary>
删除数据
</summary>
<typeparam name="T1"></typeparam>
<returns></returns>
</member>
<member name="M:IFreeSql.Delete``1(System.Object)">
<summary>
删除数据,传入动态对象如:主键值 | new[]{主键值1,主键值2} | TEntity1 | new[]{TEntity1,TEntity2} | new{id=1}
</summary>
<typeparam name="T1"></typeparam>
<param name="dywhere">主键值、主键值集合、实体、实体集合、匿名对象、匿名对象集合</param>
<returns></returns>
</member>
<member name="M:IFreeSql.Transaction(System.Action)">
<summary>
开启事务不支持异步60秒未执行完将自动提交
</summary>
<param name="handler">事务体 () => {}</param>
</member>
<member name="M:IFreeSql.Transaction(System.Action,System.TimeSpan)">
<summary>
开启事务(不支持异步)
</summary>
<param name="handler">事务体 () => {}</param>
<param name="timeout">超时,未执行完将自动提交</param>
</member>
<member name="P:IFreeSql.Ado">
<summary>
数据库访问对象
</summary>
</member>
<member name="P:IFreeSql.Aop">
<summary>
所有拦截方法都在这里
</summary>
</member>
<member name="P:IFreeSql.CodeFirst">
<summary>
CodeFirst 模式开发相关方法
</summary>
</member>
<member name="P:IFreeSql.DbFirst"> <member name="P:IFreeSql.DbFirst">
<summary> <summary>
DbFirst 模式开发相关方法 DbFirst 模式开发相关方法

View File

@ -276,8 +276,8 @@ where a.owner in ({1}) and {0}
ds2item[1] = row[1]; ds2item[1] = row[1];
ds2item[2] = Regex.Replace(string.Concat(row[2]), @"\(\d+\)", ""); ds2item[2] = Regex.Replace(string.Concat(row[2]), @"\(\d+\)", "");
ds2item[4] = OdbcOracleCodeFirst.GetOracleSqlTypeFullName(new object[] { row[1], row[2], row[3], row[4], row[5], row[6] }); ds2item[4] = OdbcOracleCodeFirst.GetOracleSqlTypeFullName(new object[] { row[1], row[2], row[3], row[4], row[5], row[6] });
ds2item[5] = string.Concat(row[7]) == "1"; ds2item[5] = string.Concat(row[7]);
ds2item[6] = string.Concat(row[8]) == "1"; ds2item[6] = string.Concat(row[8]);
ds2item[7] = string.Concat(row[9]); ds2item[7] = string.Concat(row[9]);
ds2.Add(ds2item); ds2.Add(ds2item);
} }
@ -321,7 +321,7 @@ a.table_owner || '.' || a.table_name,
nvl(freesql_long_2_varchar(a.index_name, c.table_name, c.column_position), c.column_name), nvl(freesql_long_2_varchar(a.index_name, c.table_name, c.column_position), c.column_name),
c.index_name, c.index_name,
case when a.uniqueness = 'UNIQUE' then 1 else 0 end, case when a.uniqueness = 'UNIQUE' then 1 else 0 end,
0, case when exists(select 1 from all_constraints where constraint_name = a.index_name and constraint_type = 'P') then 1 else 0 end,
0, 0,
case when c.descend = 'DESC' then 1 else 0 end, case when c.descend = 'DESC' then 1 else 0 end,
c.column_position c.column_position
@ -331,7 +331,6 @@ where a.index_name = c.index_name
and a.table_owner = c.table_owner and a.table_owner = c.table_owner
and a.table_name = c.table_name and a.table_name = c.table_name
and a.table_owner in ({1}) and {0} and a.table_owner in ({1}) and {0}
and not exists(select 1 from all_constraints where constraint_name = a.index_name and constraint_type = 'P')
", loc8, databaseIn); ", loc8, databaseIn);
ds = _orm.Ado.ExecuteArray(CommandType.Text, sql); ds = _orm.Ado.ExecuteArray(CommandType.Text, sql);
if (ds == null) return loc1; if (ds == null) return loc1;
@ -352,6 +351,7 @@ and not exists(select 1 from all_constraints where constraint_name = a.index_nam
if (loc3.ContainsKey(table_id) == false || loc3[table_id].ContainsKey(column) == false) continue; if (loc3.ContainsKey(table_id) == false || loc3[table_id].ContainsKey(column) == false) continue;
var loc9 = loc3[table_id][column]; var loc9 = loc3[table_id][column];
if (loc9.IsPrimary == false && is_primary_key) loc9.IsPrimary = is_primary_key; if (loc9.IsPrimary == false && is_primary_key) loc9.IsPrimary = is_primary_key;
if (is_primary_key) continue;
Dictionary<string, DbIndexInfo> loc10 = null; Dictionary<string, DbIndexInfo> loc10 = null;
DbIndexInfo loc11 = null; DbIndexInfo loc11 = null;

View File

@ -276,8 +276,8 @@ where a.owner in ({1}) and {0}
ds2item[1] = row[1]; ds2item[1] = row[1];
ds2item[2] = Regex.Replace(string.Concat(row[2]), @"\(\d+\)", ""); ds2item[2] = Regex.Replace(string.Concat(row[2]), @"\(\d+\)", "");
ds2item[4] = OracleCodeFirst.GetOracleSqlTypeFullName(new object[] { row[1], row[2], row[3], row[4], row[5], row[6] }); ds2item[4] = OracleCodeFirst.GetOracleSqlTypeFullName(new object[] { row[1], row[2], row[3], row[4], row[5], row[6] });
ds2item[5] = string.Concat(row[7]) == "1"; ds2item[5] = string.Concat(row[7]);
ds2item[6] = string.Concat(row[8]) == "1"; ds2item[6] = string.Concat(row[8]);
ds2item[7] = string.Concat(row[9]); ds2item[7] = string.Concat(row[9]);
ds2.Add(ds2item); ds2.Add(ds2item);
} }
@ -321,7 +321,7 @@ a.table_owner || '.' || a.table_name,
nvl(freesql_long_2_varchar(a.index_name, c.table_name, c.column_position), c.column_name), nvl(freesql_long_2_varchar(a.index_name, c.table_name, c.column_position), c.column_name),
c.index_name, c.index_name,
case when a.uniqueness = 'UNIQUE' then 1 else 0 end, case when a.uniqueness = 'UNIQUE' then 1 else 0 end,
0, case when exists(select 1 from all_constraints where constraint_name = a.index_name and constraint_type = 'P') then 1 else 0 end,
0, 0,
case when c.descend = 'DESC' then 1 else 0 end, case when c.descend = 'DESC' then 1 else 0 end,
c.column_position c.column_position
@ -331,7 +331,6 @@ where a.index_name = c.index_name
and a.table_owner = c.table_owner and a.table_owner = c.table_owner
and a.table_name = c.table_name and a.table_name = c.table_name
and a.table_owner in ({1}) and {0} and a.table_owner in ({1}) and {0}
and not exists(select 1 from all_constraints where constraint_name = a.index_name and constraint_type = 'P')
", loc8, databaseIn); ", loc8, databaseIn);
ds = _orm.Ado.ExecuteArray(CommandType.Text, sql); ds = _orm.Ado.ExecuteArray(CommandType.Text, sql);
if (ds == null) return loc1; if (ds == null) return loc1;
@ -352,6 +351,7 @@ and not exists(select 1 from all_constraints where constraint_name = a.index_nam
if (loc3.ContainsKey(table_id) == false || loc3[table_id].ContainsKey(column) == false) continue; if (loc3.ContainsKey(table_id) == false || loc3[table_id].ContainsKey(column) == false) continue;
var loc9 = loc3[table_id][column]; var loc9 = loc3[table_id][column];
if (loc9.IsPrimary == false && is_primary_key) loc9.IsPrimary = is_primary_key; if (loc9.IsPrimary == false && is_primary_key) loc9.IsPrimary = is_primary_key;
if (is_primary_key) continue;
Dictionary<string, DbIndexInfo> loc10 = null; Dictionary<string, DbIndexInfo> loc10 = null;
DbIndexInfo loc11 = null; DbIndexInfo loc11 = null;