mirror of
				https://github.com/nsnail/FreeSql.git
				synced 2025-11-04 17:20:49 +08:00 
			
		
		
		
	- 解决 表名名称包含点,无法进行 CRUD 的问题,由于测试的复杂性,此类情况仅支持 MySql/Sqlite CodeFirst 自动迁移;
> 注意:尽量不要使用带点的表名,只有 MySql/Sqlite 对此类表名支持 CodeFirst。但是它不影响 CRUD 功能,使用 [Table(Name = "`sys.config`")] 解决
This commit is contained in:
		@@ -94,15 +94,15 @@ namespace FreeSql.Odbc.Dameng
 | 
			
		||||
                var tb = _commonUtils.GetTableByEntity(obj.entityType);
 | 
			
		||||
                if (tb == null) throw new Exception($"类型 {obj.entityType.FullName} 不可迁移");
 | 
			
		||||
                if (tb.Columns.Any() == false) throw new Exception($"类型 {obj.entityType.FullName} 不可迁移,可迁移属性0个");
 | 
			
		||||
                var tbname = tb.DbName.Split(new[] { '.' }, 2);
 | 
			
		||||
                var tbname = _commonUtils.SplitTableName(tb.DbName);
 | 
			
		||||
                if (tbname?.Length == 1) tbname = new[] { userId, tbname[0] };
 | 
			
		||||
 | 
			
		||||
                var tboldname = tb.DbOldName?.Split(new[] { '.' }, 2); //旧表名
 | 
			
		||||
                var tboldname = _commonUtils.SplitTableName(tb.DbOldName); //旧表名
 | 
			
		||||
                if (tboldname?.Length == 1) tboldname = new[] { userId, tboldname[0] };
 | 
			
		||||
                var primaryKeyName = (obj.entityType.GetCustomAttributes(typeof(OraclePrimaryKeyNameAttribute), false)?.FirstOrDefault() as OraclePrimaryKeyNameAttribute)?.Name;
 | 
			
		||||
                if (string.IsNullOrEmpty(obj.tableName) == false)
 | 
			
		||||
                {
 | 
			
		||||
                    var tbtmpname = obj.tableName.Split(new[] { '.' }, 2);
 | 
			
		||||
                    var tbtmpname = _commonUtils.SplitTableName(obj.tableName);
 | 
			
		||||
                    if (tbtmpname?.Length == 1) tbtmpname = new[] { userId, tbtmpname[0] };
 | 
			
		||||
                    if (tbname[0] != tbtmpname[0] || tbname[1] != tbtmpname[1])
 | 
			
		||||
                    {
 | 
			
		||||
@@ -111,6 +111,7 @@ namespace FreeSql.Odbc.Dameng
 | 
			
		||||
                        primaryKeyName = null;
 | 
			
		||||
                    }
 | 
			
		||||
                }
 | 
			
		||||
                //codefirst 不支持表名中带 .
 | 
			
		||||
 | 
			
		||||
                if (string.Compare(tbname[0], userId) != 0 && _orm.Ado.ExecuteScalar(CommandType.Text, _commonUtils.FormatSql(" select 1 from sys.dba_users where username={0}", tbname[0])) == null) //创建数据库
 | 
			
		||||
                    throw new NotImplementedException($"Oracle CodeFirst 不支持代码创建 tablespace 与 schemas {tbname[0]}");
 | 
			
		||||
 
 | 
			
		||||
@@ -4,8 +4,6 @@ using System;
 | 
			
		||||
using System.Collections.Generic;
 | 
			
		||||
using System.Data.Common;
 | 
			
		||||
using System.Data.Odbc;
 | 
			
		||||
using System.Linq.Expressions;
 | 
			
		||||
using System.Text;
 | 
			
		||||
 | 
			
		||||
namespace FreeSql.Odbc.Dameng
 | 
			
		||||
{
 | 
			
		||||
@@ -68,12 +66,18 @@ namespace FreeSql.Odbc.Dameng
 | 
			
		||||
            });
 | 
			
		||||
 | 
			
		||||
        public override string FormatSql(string sql, params object[] args) => sql?.FormatOdbcOracle(args);
 | 
			
		||||
        public override string QuoteSqlName(string name)
 | 
			
		||||
        public override string QuoteSqlName(params string[] name)
 | 
			
		||||
        {
 | 
			
		||||
            var nametrim = name.Trim();
 | 
			
		||||
            if (nametrim.StartsWith("(") && nametrim.EndsWith(")"))
 | 
			
		||||
                return nametrim; //原生SQL
 | 
			
		||||
            return $"\"{nametrim.Trim('"').Replace(".", "\".\"")}\"";
 | 
			
		||||
            if (name.Length == 1)
 | 
			
		||||
            {
 | 
			
		||||
                var nametrim = name[0].Trim();
 | 
			
		||||
                if (nametrim.StartsWith("(") && nametrim.EndsWith(")"))
 | 
			
		||||
                    return nametrim; //原生SQL
 | 
			
		||||
                if (nametrim.StartsWith("\"") && nametrim.EndsWith("\""))
 | 
			
		||||
                    return nametrim;
 | 
			
		||||
                return $"\"{nametrim.Replace(".", "\".\"")}\"";
 | 
			
		||||
            }
 | 
			
		||||
            return $"\"{string.Join("\".\"", name)}\"";
 | 
			
		||||
        }
 | 
			
		||||
        public override string TrimQuoteSqlName(string name)
 | 
			
		||||
        {
 | 
			
		||||
@@ -82,6 +86,7 @@ namespace FreeSql.Odbc.Dameng
 | 
			
		||||
                return nametrim; //原生SQL
 | 
			
		||||
            return $"{nametrim.Trim('"').Replace("\".\"", ".").Replace(".\"", ".")}";
 | 
			
		||||
        }
 | 
			
		||||
        public override string[] SplitTableName(string name) => GetSplitTableNames(name, '"', '"', 2);
 | 
			
		||||
        public override string QuoteParamterName(string name) => $":{(_orm.CodeFirst.IsSyncStructureToLower ? name.ToLower() : name)}";
 | 
			
		||||
        public override string IsNull(string sql, object value) => $"nvl({sql}, {value})";
 | 
			
		||||
        public override string StringConcat(string[] objs, Type[] types) => $"{string.Join(" || ", objs)}";
 | 
			
		||||
 
 | 
			
		||||
		Reference in New Issue
	
	Block a user