Browse Source

SqlClient:属性的顺序改为基类属性在前。

master
王厅 1 week ago
parent
commit
7127eb6e07
  1. 18
      Apewer.Source/Source/SqlClient.cs
  2. 3
      Apewer/RuntimeUtility.cs
  3. 29
      Apewer/Source/TableStructure.cs

18
Apewer.Source/Source/SqlClient.cs

@ -113,7 +113,9 @@ namespace Apewer.Source
columns = lower.ToArray(); columns = lower.ToArray();
} }
// 增加列。 // 找出新列。
var newColumns = new List<ColumnAttribute>();
var newPrimaryKey = new List<PrimaryKey>();
foreach (var column in structure.Columns) foreach (var column in structure.Columns)
{ {
// 检查 Independent 特性。 // 检查 Independent 特性。
@ -124,11 +126,19 @@ namespace Apewer.Source
if (columns.Contains(lower)) continue; if (columns.Contains(lower)) continue;
var type = Declaration(column); var type = Declaration(column);
if (string.IsNullOrEmpty(type)) return TextUtility.Merge("类型 ", column.Type.ToString(), " 不受支持。"); if (string.IsNullOrEmpty(type)) return $"类型 {column.Type} 不受支持。";
newColumns.Add(column);
}
var sql = TextUtility.Merge("alter table [", table, "] add ", type, "; "); // 执行:添加列。
if (newColumns.IsEmpty()) return TextUtility.Empty;
foreach (var column in newColumns)
{
var type = Declaration(column);
var sql = $"alter table [{table}] add {type}; ";
var execute = Execute(sql, null, false); var execute = Execute(sql, null, false);
if (execute.Success == false) return execute.Message; if (!execute.Success) return execute.Message;
} }
return TextUtility.Empty; return TextUtility.Empty;
} }

3
Apewer/RuntimeUtility.cs

@ -15,6 +15,9 @@ namespace Apewer
public static class RuntimeUtility public static class RuntimeUtility
{ {
/// <summary><see cref="object" /></summary>
public static Type ObjectType { get; } = typeof(object);
/// <summary>使用默认比较器判断相等。</summary> /// <summary>使用默认比较器判断相等。</summary>
public static bool Equals<T>(T a, T b) => EqualityComparer<T>.Default.Equals(a, b); public static bool Equals<T>(T a, T b) => EqualityComparer<T>.Default.Equals(a, b);

29
Apewer/Source/TableStructure.cs

@ -111,7 +111,7 @@ namespace Apewer.Source
// 类型。 // 类型。
var isRecord = RuntimeUtility.IsInherits(type, typeof(Record)); var isRecord = RuntimeUtility.IsInherits(type, typeof(Record));
var properties = type.GetProperties(); var properties = GetProperties(type);
var total = properties.Length; var total = properties.Length;
// 解析 ColumnAttribute。 // 解析 ColumnAttribute。
@ -190,6 +190,33 @@ namespace Apewer.Source
return ts; return ts;
} }
// 获取属性,基类的属性排在前面。
static PropertyInfo[] GetProperties(Type type)
{
if (type == null) throw new ArgumentNullException(nameof(type));
// 需要获取属性的类型。
var types = new List<Type>();
{
var target = type;
while (true)
{
if (target.Equals(RuntimeUtility.ObjectType)) break;
types.Add(target);
target = target.BaseType;
}
}
// 所有属性。
var list = new List<PropertyInfo>();
for (var i = types.Count - 1; i >= 0; i--)
{
var properties = types[i].GetProperties(BindingFlags.Public | BindingFlags.Instance | BindingFlags.DeclaredOnly);
list.Add(properties);
}
return list.ToArray();
}
#endregion #endregion
#region TableAttribute #region TableAttribute

Loading…
Cancel
Save