[AttributeUsage(AttributeTargets.Class)] public class TableAttribute : Attribute { public TableAttribute(string tableName) { Name = tableName; } public string Name { get; private set; } } [AttributeUsage(AttributeTargets.Property)] public class KeyAttribute : Attribute { public KeyAttribute() : this(false) { } public KeyAttribute(bool isIdentity) { IsIdentity = isIdentity; } public bool IsIdentity { get; private set; } } [AttributeUsage(AttributeTargets.Property)] public class IgnoreAttribute : Attribute { } [AttributeUsage(AttributeTargets.Property)] public class ColumnAttribute : Attribute { public ColumnAttribute(string columnName) { Name = columnName; QueryName = columnName; } public ColumnAttribute(string columnName, string queryName) : this(columnName) { QueryName = queryName; } public string Name { get; private set; } public string QueryName { get; private set; } }
要使用TypeInfo的类必须在Entity上标志以上属性,特别是Key属性作为数据库表的主键必须存在,否则以全部字段进行匹配,可能会产生不一致的问题
下面是实体增删改功能的实现
public static class EntityMapper { private static readonly ConcurrentDictionary<RuntimeTypeHandle, TypeInfo> TypeTableInfo = new ConcurrentDictionary<RuntimeTypeHandle, TypeInfo>(); public static T Get<T>(SSGClass.ExpressOpr exp) where T : new() { var info = TryGetInfo(typeof(T)); var reader = SSGClass.DBConnect.ServerDb.ExecuteReader(info.SelectText + exp.ToParameters(), exp.Parameters); if (reader.Read()) { return info.GenEntity<T>(reader); } throw new ExceptionTecnical(string.Format(Global.Consts.OutOfRing, typeof(T).Name)); } static TypeInfo TryGetInfo(Type type) { TypeInfo info; RuntimeTypeHandle handle = type.TypeHandle; if (!TypeTableInfo.TryGetValue(handle, out info)) { info = new TypeInfo(type); TypeTableInfo[handle] = info; } return info; } public static List<T> GetList<T>(SSGClass.ExpressOpr exp = null) where T:new() { List<T> lst = new List<T>(); var info = TryGetInfo(typeof(T)); System.Data.Common.DbDataReader reader; if (exp == null) reader = SSGClass.DBConnect.ServerDb.ExecuteReader(info.SelectText, null); else reader = SSGClass.DBConnect.ServerDb.ExecuteReader(info.SelectText + exp.ToParameters(), exp.Parameters); while (reader.Read()) { lst.Add(info.GenEntity<T>(reader)); } return lst; } public static int Delete<T>(SSGClass.ExpressOpr exp = null) { string deleteText = TryGetInfo(typeof(T)).DeleteText; if (exp == null) return SSGClass.DBConnect.ServerDb.ExcuteCommand(deleteText, null); else return SSGClass.DBConnect.ServerDb.ExcuteCommand(deleteText + exp.ToParameters(), exp.Parameters); } public static int DeleteAll<T>() { return Delete<T>(); } public static int Delete(object entity) { var info = TryGetInfo(entity.GetType()); return Delete(info.GetDeleteExpress(entity)); } public static int Update(object entity) { var info = TryGetInfo(entity.GetType()); return SSGClass.DBConnect.ServerDb.ExcuteCommand(info.UpdateText, info.GetEntityPatams(entity)); } public static int Insert(object entity) { var info = TryGetInfo(entity.GetType()); return SSGClass.DBConnect.ServerDb.ExcuteCommand(info.InsertText, info.GetEntityPatams(entity)); } }