using System; using System.Collections.Generic; using System.Collections; using System.Reflection; using System.Data; using System.Text; using Ant.Frame; using Ant.Entity; using System.Linq; using Ant.DbExpressions; using Ant.Descriptors; using Ant.Exceptions; using Ant.Common; namespace Ant.ORM { /// /// /// public sealed class MetaDataManager { private static Dictionary MetaDataChache = new Dictionary(); private static object lockHelper = new object(); /// /// 获取实体的元数据 /// /// 实体数据 /// public static MetaData GetMetaData(object enty) { MetaData mdmod = new MetaData(); mdmod.FiledMeta = GetMetaData(enty.GetType());//获取实体属性 ParserMeta(enty, null, mdmod);//获取实体的值 return mdmod; } /// /// 获取值和查询实体的属性和值,此方法用Update /// /// 需要更新的实体 /// 用于查询条件的实体 /// public static MetaData GetMetaData(object enty, object entywhere) { MetaData mdmod = new MetaData(); mdmod.FiledMeta = GetMetaData(enty.GetType()); ParserMeta(enty, entywhere, mdmod); return mdmod; } /// /// 获取实体的元数据 /// /// 实体类型 /// public static FiledMetaData GetMetaData(Type t) { MetaData md = new MetaData(); string key = string.Format(@"{0}.{1}", t.Namespace, t.Name); if (!MetaDataChache.ContainsKey(key)) { lock (lockHelper) { if (!MetaDataChache.ContainsKey(key)) { var filed = GetParserMeta(t); var ll = filed.MemberColumnMap; MetaDataChache.Add(key, filed); //string value = ""; //value = "表名:" + ll.Values.FirstOrDefault().Table.Name; //foreach (DbColumnAccessExpression mm in ll.Values) //{ // value = value + ";列名:" + mm.Column.Name; //} //LoggerHelper.Info(key + "的字段值:" + value + ";总列数:" + ll.Values.Count()); } } } return MetaDataChache[key]; } /// /// 获取缓存记录 /// /// public static int GetMetaDataCount() { return MetaDataChache.Count; } /// /// 获取缓存数据 /// /// public static List GetMetaDataList() { List list = new List(); foreach (string key in MetaDataChache.Keys) { list.Add(key); } return list; } /// /// 移除某个缓存 /// /// /// public static bool Remove(string key) { if (MetaDataChache.ContainsKey(key)) { return MetaDataChache.Remove(key); } return true; } /// /// 清除缓存 /// /// public static bool Clear() { MetaDataChache.Clear(); return true; } /// /// 获取字段属性 /// /// /// private static FiledMetaData GetParserMeta(Type t) { FiledMetaData filed = new FiledMetaData(); filed.EntityType = t; filed.Propertys = t.GetProperties(BindingFlags.GetProperty | BindingFlags.Public | BindingFlags.Instance); filed.Table = InitTableInfo(t); filed.Fields = new List(); List mappingMember = new List(); var pinfos = filed.Propertys; filed.MappingMemberDescriptors = new Dictionary(pinfos.Count()); filed.MemberColumnMap = new Dictionary(pinfos.Count()); foreach (PropertyInfo pinfo in pinfos) { MappingMemberDescriptor memberDescriptor = ConstructMappingMemberDescriptor(pinfo, filed); mappingMember.Add(memberDescriptor); filed.MappingMemberDescriptors.Add(memberDescriptor.MemberInfo, memberDescriptor); var ignoreFlags = pinfo.GetCustomAttributes(typeof(NotMappedAttribute), false); if (ignoreFlags.Length == 0) { filed.MemberColumnMap.Add(memberDescriptor.MemberInfo, new DbColumnAccessExpression(filed.Table, memberDescriptor.Column)); filed.Fields.Add(memberDescriptor.MemberInfo); } } int primaryKeyCount = mappingMember.Where(a => a.IsPrimaryKey).Count(); if (primaryKeyCount > 1) throw new NotSupportedException(string.Format("映射类型 '{0}'不能定义多个主键", filed.EntityType.FullName)); else if (primaryKeyCount == 1) { filed.PrimaryKey = mappingMember.Where(a => a.IsPrimaryKey).First(); } else { //如果没有定义任何主键,则从所有映射的属性中查找名为 id 的属性作为主键 MappingMemberDescriptor idNameMemberDescriptor = mappingMember.Where(a => a.MemberInfo.Name.ToLower() == "id" && !a.IsDefined(typeof(ColumnAttribute))).FirstOrDefault(); if (idNameMemberDescriptor != null) { idNameMemberDescriptor.IsPrimaryKey = true; filed.PrimaryKey = idNameMemberDescriptor; } } List autoIncrementMemberDescriptors = mappingMember.Where(a => a.IsDefined(typeof(AutoIncrementAttribute))).ToList(); if (autoIncrementMemberDescriptors.Count > 1) { throw new NotSupportedException(string.Format("映射类型'{0}'不能确定多个自动增量成员", filed.EntityType.FullName)); } else if (autoIncrementMemberDescriptors.Count == 1) { MappingMemberDescriptor autoIncrementMemberDescriptor = autoIncrementMemberDescriptors[0]; if (autoIncrementMemberDescriptor.IsDefined(typeof(NotAutoIncrementAttribute))) { throw new AntORMException(string.Format("不能在相同的映射成员上定义 'AutoIncrementAttribute' 和 'NotAutoIncrementAttribute'{0}'.", autoIncrementMemberDescriptor.MemberInfo.Name)); } if (!IsAutoIncrementType(autoIncrementMemberDescriptor.MemberInfoType)) { throw new AntORMException("自动增量成员类型必须是 Int16,Int32 或 Int64"); } autoIncrementMemberDescriptor.IsAutoIncrement = true; filed.AutoIncrement = autoIncrementMemberDescriptor; } else { MappingMemberDescriptor defaultAutoIncrementMemberDescriptor = mappingMember.Where(a => a.IsPrimaryKey && IsAutoIncrementType(a.MemberInfoType) && !a.IsDefined(typeof(NotAutoIncrementAttribute))).FirstOrDefault(); if (defaultAutoIncrementMemberDescriptor != null) { defaultAutoIncrementMemberDescriptor.IsAutoIncrement = true; filed.AutoIncrement = defaultAutoIncrementMemberDescriptor; } } return filed; } /// /// 获取实体类每个成员的属性 /// /// /// /// static MappingMemberDescriptor ConstructMappingMemberDescriptor(PropertyInfo pinfo, FiledMetaData meta) { string columnName = null; bool isPrimaryKey = false; var columnFlags = pinfo.GetCustomAttributes(typeof(ColumnAttribute), true); if (columnFlags.Length > 0) { ColumnAttribute columnFlag = columnFlags.First() as ColumnAttribute; if (columnFlag.Name != null) columnName = columnFlag.Name; else columnName = pinfo.Name; if (columnFlag.IsPrimaryKey) { isPrimaryKey = true; } } else columnName = pinfo.Name; MappingMemberDescriptor memberDescriptor = null; PropertyInfo propertyInfo = pinfo as PropertyInfo; if (propertyInfo != null) { memberDescriptor = new PropertyDescriptor(propertyInfo, meta, columnName); } memberDescriptor.IsPrimaryKey = isPrimaryKey; return memberDescriptor; } /// /// 判断是否是自动增长 /// /// /// static bool IsAutoIncrementType(Type t) { return t == UtilConstants.TypeOfInt16 || t == UtilConstants.TypeOfInt32 || t == UtilConstants.TypeOfInt64 || t == UtilConstants.TypeOfIntNull16 || t == UtilConstants.TypeOfIntNull32 || t == UtilConstants.TypeOfIntNull64; } /// /// 是否是自动增长 /// /// /// public static bool IsAutoIncrement(MappingMemberDescriptor memberDescriptor, MetaData md) { return md.FiledMeta.AutoIncrement == memberDescriptor; } /// /// 通过MemberInfo获取实体映射关系 /// /// /// public static MappingMemberDescriptor TryGetMappingMemberDescriptor(MemberInfo memberInfo, FiledMetaData md) { MappingMemberDescriptor memberDescriptor; if (!md.MappingMemberDescriptors.TryGetValue(memberInfo, out memberDescriptor)) { return null; } return memberDescriptor; } /// /// 通字段名获取实体映射关系 /// /// /// public static MappingMemberDescriptor GetMappingMemberDescriptor(string memberName, FiledMetaData md) { MappingMemberDescriptor memberDescriptor; var memberInfo = md.Fields.Where(a => a.Name == memberName).FirstOrDefault(); if (!md.MappingMemberDescriptors.TryGetValue(memberInfo, out memberDescriptor)) { return null; } return memberDescriptor; } /// /// 主键是否存在 /// /// public static bool HasPrimaryKey(FiledMetaData md) { return md.PrimaryKey != null; } /// /// /// /// /// static DbTable InitTableInfo(Type t) { var tableFlags = t.GetCustomAttributes(typeof(TableAttribute), false); string tableName; if (tableFlags.Length > 0) { TableAttribute tableFlag = (TableAttribute)tableFlags.First(); if (tableFlag.Name != null) tableName = tableFlag.Name; else tableName = t.Name; } else tableName = t.Name; return new DbTable(tableName); } /// /// 获取实体模块 /// /// /// public static dynamic GetEntityByName(object enty, string name) { PropertyInfo pinfo = enty.GetType().GetProperty(name); if (pinfo.IfNotNull()) { var obj = pinfo.GetValue(enty, null); return obj; } return null; } /// /// /// /// /// /// public static EntityPersistType GetEnumByName(object enty, string name) { PropertyInfo pinfo = enty.GetType().GetProperty(name); if (pinfo.IfNotNull()) { var obj = pinfo.GetValue(enty, null); var vl = (EntityPersistType)Enum.Parse(typeof(EntityPersistType), obj.ToString()); return vl; } return EntityPersistType.Save; } /// /// 对有查询条件实体来进行获取实体的属性 /// /// /// UPDATE操作才会需要用,用来遍历查询实体 /// /// public static MetaData ParserMeta(object entyvalue, object entywhere, MetaData md) { var t = entyvalue.GetType(); FieldValueCollection fields = new FieldValueCollection();//字段值 //if (md.FieldsColumns.IsNull()) // md.FieldsColumns = new Dictionary(); //2017.11.29修改 md.FieldsColumns = new Dictionary(); if (md.FiledMeta.Fields.IsNull()) md.FiledMeta.Fields = new List(); if (md.WhereColumns.IsNull()) md.WhereColumns = new Dictionary(); //md.Values = new Dictionary(); //md.ModuleName = GetEntityByName(entyvalue, "ModuleName") as string; //md.Values = GetEntityByName(entyvalue, "Values") as Dictionary; md.PersistType = GetEnumByName(entyvalue, "PersistType"); string str = string.Empty; #region get fields 获取映射字段 foreach (var kv in md.FiledMeta.MemberColumnMap) { MemberInfo member = kv.Key; //md.Fields.Add(member); MappingMemberDescriptor memberDescriptor = TryGetMappingMemberDescriptor(kv.Key, md.FiledMeta); var val = memberDescriptor.GetValue(entyvalue); str += "列名:" + member.Name + "当前值:" + val; if (val.IfNotNull()) { if (md.FiledMeta.MemberColumnMap.ContainsKey(kv.Key)) { if (md.FieldsColumns.ContainsKey(kv.Key.Name)) { var orginvalue = md.FieldsColumns[kv.Key.Name].Value; str += "原始值:" + orginvalue; if (orginvalue != val) { var column = memberDescriptor.Column; column.Value = val; md.FieldsColumns[kv.Key.Name] = column; //md.Values = SetChanaged(memberDescriptor.Column.Name, val, md.Values); } } else { var column = memberDescriptor.Column; column.Value = val; md.FieldsColumns.Add(kv.Key.Name, column); //md.Values = SetChanaged(memberDescriptor.Column.Name, val, md.Values); } } } if (entywhere.IfNotNull()) { var wherevalue = memberDescriptor.GetValue(entywhere); if (md.FiledMeta.MemberColumnMap.ContainsKey(kv.Key)) { DbExpression valExp = DbExpression.Parameter(wherevalue, memberDescriptor.MemberInfoType); valExp.ParameterValue = wherevalue; var column = memberDescriptor.Column; column.Value = wherevalue; md.WhereColumns.Add(kv.Key.Name, column);//获取列值 } } } #endregion //LoggerHelper.Info("表名:" + md.FiledMeta.Table.Name + str); //md.Fields = fields;//除了update以外的查询条件//update的赋值 return md; } /// /// 获取实体的操作类型 /// /// /// public static EntityPersistType GetEntityType(object enty) { PropertyInfo pinfo = enty.GetType().GetProperty("PersistType"); if (pinfo.IfNotNull()) { return (EntityPersistType)pinfo.GetValue(enty, null); } return EntityPersistType.Save; } /// /// 获取实体模块 /// /// /// public static string GetEntityModuleName(object enty) { PropertyInfo pinfo = enty.GetType().GetProperty("ModuleName"); if (pinfo.IfNotNull()) { return pinfo.GetValue(enty, null).ToString(); } return ""; } /// /// /// /// /// private static DbType GetDbType(Type s) { DbType dbType; switch (s.Name) { case "String": dbType = DbType.String; break; case "Int32": dbType = DbType.Int32; break; case "Int16": dbType = DbType.Int16; break; case "Double": dbType = DbType.Double; break; case "Boolean": dbType = DbType.Boolean; break; case "DateTime": dbType = DbType.DateTime; break; default: dbType = DbType.String; break; } return dbType; } } }