mirror of
				https://github.com/nsnail/FreeSql.git
				synced 2025-11-04 01:05:27 +08:00 
			
		
		
		
	增加 Column.Unique 唯一键 #42
This commit is contained in:
		@@ -1,4 +1,5 @@
 | 
			
		||||
using System;
 | 
			
		||||
using System.Collections.Concurrent;
 | 
			
		||||
using System.Text.RegularExpressions;
 | 
			
		||||
 | 
			
		||||
namespace FreeSql.Internal.CommonProvider {
 | 
			
		||||
@@ -10,10 +11,12 @@ namespace FreeSql.Internal.CommonProvider {
 | 
			
		||||
			var nparms = new object[parms.Length];
 | 
			
		||||
			for (int a = 0; a < parms.Length; a++) {
 | 
			
		||||
				if (parms[a] == null)
 | 
			
		||||
					filter = Regex.Replace(filter, @"\s*(=|IN)\s*\{" + a + @"\}", " IS {" + a + "}", RegexOptions.IgnoreCase);
 | 
			
		||||
					filter = _dicAddslashesReplaceIsNull.GetOrAdd(a, b => new Regex(@"\s*(=|IN)\s*\{" + b + @"\}", RegexOptions.IgnoreCase | RegexOptions.Compiled))
 | 
			
		||||
						.Replace(filter, $" IS {{{a}}}");
 | 
			
		||||
				nparms[a] = AddslashesProcessParam(parms[a], null);
 | 
			
		||||
			}
 | 
			
		||||
			try { string ret = string.Format(filter, nparms); return ret; } catch { return filter; }
 | 
			
		||||
		}
 | 
			
		||||
		static ConcurrentDictionary<int, Regex> _dicAddslashesReplaceIsNull = new ConcurrentDictionary<int, Regex>();
 | 
			
		||||
	}
 | 
			
		||||
}
 | 
			
		||||
 
 | 
			
		||||
@@ -101,6 +101,7 @@ namespace FreeSql.Internal {
 | 
			
		||||
				if (trycol._IsNullable != null) attr._IsNullable = trycol.IsNullable;
 | 
			
		||||
				if (trycol._IsIgnore != null) attr._IsIgnore = trycol.IsIgnore;
 | 
			
		||||
				if (trycol._IsVersion != null) attr._IsVersion = trycol.IsVersion;
 | 
			
		||||
				if (!string.IsNullOrEmpty(trycol.Unique)) attr.Unique = trycol.Unique;
 | 
			
		||||
				if (trycol.MapType != null) attr.MapType = trycol.MapType;
 | 
			
		||||
				if (trycol.DbDefautValue != null) attr.DbDefautValue = trycol.DbDefautValue;
 | 
			
		||||
			}
 | 
			
		||||
@@ -116,6 +117,7 @@ namespace FreeSql.Internal {
 | 
			
		||||
				if (tryattr._IsNullable != null) attr._IsNullable = tryattr.IsNullable;
 | 
			
		||||
				if (tryattr._IsIgnore != null) attr._IsIgnore = tryattr.IsIgnore;
 | 
			
		||||
				if (tryattr._IsVersion != null) attr._IsVersion = tryattr.IsVersion;
 | 
			
		||||
				if (!string.IsNullOrEmpty(tryattr.Unique)) attr.Unique = tryattr.Unique;
 | 
			
		||||
				if (tryattr.MapType != null) attr.MapType = tryattr.MapType;
 | 
			
		||||
				if (tryattr.DbDefautValue != null) attr.DbDefautValue = tryattr.DbDefautValue;
 | 
			
		||||
			}
 | 
			
		||||
@@ -128,6 +130,7 @@ namespace FreeSql.Internal {
 | 
			
		||||
			if (attr._IsNullable != null) ret = attr;
 | 
			
		||||
			if (attr._IsIgnore != null) ret = attr;
 | 
			
		||||
			if (attr._IsVersion != null) ret = attr;
 | 
			
		||||
			if (!string.IsNullOrEmpty(attr.Unique)) ret = attr;
 | 
			
		||||
			if (attr.MapType != null) ret = attr;
 | 
			
		||||
			if (attr.DbDefautValue != null) ret = attr;
 | 
			
		||||
			if (ret != null && ret.MapType == null) ret.MapType = proto.PropertyType;
 | 
			
		||||
 
 | 
			
		||||
@@ -18,7 +18,11 @@ namespace FreeSql.Internal {
 | 
			
		||||
 | 
			
		||||
		static ConcurrentDictionary<DataType, ConcurrentDictionary<Type, TableInfo>> _cacheGetTableByEntity = new ConcurrentDictionary<DataType, ConcurrentDictionary<Type, TableInfo>>();
 | 
			
		||||
		internal static void RemoveTableByEntity(Type entity, CommonUtils common) {
 | 
			
		||||
			if (entity.FullName.StartsWith("<>f__AnonymousType")) return;
 | 
			
		||||
			if (entity.FullName.StartsWith("<>f__AnonymousType") ||
 | 
			
		||||
				entity.IsValueType ||
 | 
			
		||||
				entity.IsNullableType() ||
 | 
			
		||||
				entity.NullableTypeOrThis() == typeof(BigInteger)
 | 
			
		||||
				) return;
 | 
			
		||||
			var tbc = _cacheGetTableByEntity.GetOrAdd(common._orm.Ado.DataType, k1 => new ConcurrentDictionary<Type, TableInfo>()); //区分数据库类型缓存
 | 
			
		||||
			if (tbc.TryRemove(entity, out var trytb) && trytb?.TypeLazy != null) tbc.TryRemove(trytb.TypeLazy, out var trylz);
 | 
			
		||||
		}
 | 
			
		||||
@@ -75,6 +79,7 @@ namespace FreeSql.Internal {
 | 
			
		||||
						IsNullable = tp.Value.isnullable ?? true,
 | 
			
		||||
						IsPrimary = false,
 | 
			
		||||
						IsIgnore = false,
 | 
			
		||||
						Unique = null,
 | 
			
		||||
						MapType = p.PropertyType
 | 
			
		||||
					};
 | 
			
		||||
				if (colattr._IsNullable == null) colattr._IsNullable = tp?.isnullable;
 | 
			
		||||
@@ -84,8 +89,14 @@ namespace FreeSql.Internal {
 | 
			
		||||
				if (tp != null && tp.Value.isnullable == null) colattr.IsNullable = tp.Value.dbtypeFull.Contains("NOT NULL") == false;
 | 
			
		||||
				if (colattr.DbType?.Contains("NOT NULL") == true) colattr.IsNullable = false;
 | 
			
		||||
				if (string.IsNullOrEmpty(colattr.Name)) colattr.Name = p.Name;
 | 
			
		||||
				if (common.CodeFirst.IsSyncStructureToLower) colattr.Name = colattr.Name.ToLower();
 | 
			
		||||
				if (common.CodeFirst.IsSyncStructureToUpper) colattr.Name = colattr.Name.ToUpper();
 | 
			
		||||
				if (common.CodeFirst.IsSyncStructureToLower) {
 | 
			
		||||
					colattr.Name = colattr.Name.ToLower();
 | 
			
		||||
					if (!string.IsNullOrEmpty(colattr.Unique)) colattr.Unique = colattr.Unique.ToLower();
 | 
			
		||||
				}
 | 
			
		||||
				if (common.CodeFirst.IsSyncStructureToUpper) {
 | 
			
		||||
					colattr.Name = colattr.Name.ToUpper();
 | 
			
		||||
					if (!string.IsNullOrEmpty(colattr.Unique)) colattr.Unique = colattr.Unique.ToUpper();
 | 
			
		||||
				}
 | 
			
		||||
 | 
			
		||||
				if ((colattr.IsNullable != true || colattr.IsIdentity == true || colattr.IsPrimary == true) && colattr.DbType.Contains("NOT NULL") == false) {
 | 
			
		||||
					colattr.IsNullable = false;
 | 
			
		||||
@@ -177,8 +188,8 @@ namespace FreeSql.Internal {
 | 
			
		||||
				} catch { }
 | 
			
		||||
				trytb.Primarys = trytb.Columns.Values.Where(a => a.Attribute.IsPrimary == true).ToArray();
 | 
			
		||||
			}
 | 
			
		||||
			trytb.Uniques = trytb.Columns.Values.Where(a => !string.IsNullOrEmpty(a.Attribute.Unique))
 | 
			
		||||
				.ToDictionary(a => a.Attribute.Unique, a => trytb.Columns.Values.Where(b => b.Attribute.Unique == a.Attribute.Unique).ToList());
 | 
			
		||||
			trytb.Uniques = trytb.Columns.Values.Where(a => !string.IsNullOrEmpty(a.Attribute.Unique)).Select(a => a.Attribute.Unique).Distinct()
 | 
			
		||||
				.ToDictionary(a => a, a => trytb.Columns.Values.Where(b => b.Attribute.Unique == a).ToList());
 | 
			
		||||
			tbc.AddOrUpdate(entity, trytb, (oldkey, oldval) => trytb);
 | 
			
		||||
 | 
			
		||||
			#region 查找导航属性的关系、virtual 属性延时加载,动态产生新的重写类
 | 
			
		||||
 
 | 
			
		||||
		Reference in New Issue
	
	Block a user