⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 entityset.cs

📁 实现数据库中实体到类的动态映射,通过映射可方便的实现数据库记录的增删改查等操作.
💻 CS
字号:
using System;
using System.Data;
using System.Collections;

namespace EntityMapping
{
	/// <summary>
	/// EntitySet 的摘要说明。
	/// </summary>
	public class EntitySet
	{
		public EntitySet()
		{
			//
			// TODO: 在此处添加构造函数逻辑
			//
		}
		/// <summary>
		/// 数据集
		/// </summary>
		private DataSet m_DataSource;

		/// <summary>
		/// 记录着子类的实体类型
		/// </summary>
		protected Type m_EntityType;

		/// <summary>
		/// 实体缓存。
		/// 每次我们调用GetEntity方法取出一个实体的时候,我们首先检查该缓存,
		/// 如果该实体已经在enableCache中有了,就直接返回。
		/// 如果没有,就实例化一个实体,返回该实体并将该实体存入缓存。
		/// </summary>
		private Hashtable m_EntityCache;


		/// <summary>
		/// 实体集合对应的表名
		/// </summary>
		private string m_MapingTableName;

		/// <summary>
		/// 构造函数
		/// </summary>
		public EntitySet(string mapingTableName)
		{
			this.m_MapingTableName = mapingTableName;
		}

		/// <summary>
		/// 创建一个新的实体
		/// </summary>
		/// <returns></returns>
		private Entity CreateEntity()
		{
			Entity ety;
			if(m_EntityType != null)
			{
				//调用Entity或起子类类的构造函数创建Entity或其子类
				ety = (Entity)System.Activator.CreateInstance(m_EntityType);
			}
			else
			{
				ety = new Entity();
			}
			
			return ety;
		}

		/// <summary>
		/// 创建实体的属性名
		/// </summary>
		/// <returns></returns>
		private string[] CreateAttributeNames(Entity ety)
		{
			int colCount = m_DataSource.Tables[0].Columns.Count;
			//取得列名
			string[] names = new string[colCount];
			for(int i = 0;i < colCount;i++)
			{
				string fieldName = m_DataSource.Tables[0].Columns[i].ColumnName;
				names[i] = ety.GetMappingName(fieldName);				
				if(names[i] == null)
				{
					names[i] = fieldName;
				}
			}
			return names;
		}


		/// <summary>
		/// 从实体集合中取得一个实体
		/// </summary>
		/// <param name="index">想要取的的实体下标,从0开始计数</param>
		/// <returns>返回一个实体,如果没有返回NULL</returns>
		public Entity GetEntity(int index)
		{
			//下标超过最大限,返回null
			if(index > this.EntityCount - 1)
			{
				return null;
			}
			if(this.m_EntityCache == null)
			{
				this.m_EntityCache = new Hashtable();
			}
			//如果缓存中已经存在该实体则直接返回该实体
			if(this.m_EntityCache.Contains(index) == true)
			{
				return (Entity)this.m_EntityCache[index];
			}
			
			Entity ety = this.CreateEntity();
			string[] names = this.CreateAttributeNames(ety);
			
			//取得列值
			object[] Values = new object[names.Length];
			Values = m_DataSource.Tables[0].Rows[index].ItemArray;

			//填充数据
			ety.FillData(names,Values,index);
			
			//如果使用了缓存,则将entity放入缓存中去
			this.m_EntityCache.Add(index,ety);

			return ety;
		}
		
		/// <summary>
		/// 将一个实体添加到实体集合中去。
		/// 当实体集合的列为0时,自动添加列,并赋值;当实体集合的列不为0时,只添加实体和实体集合共有的列的值,其他没有值的列为空
		/// </summary>
		/// <param name="ety">需要添加的实体</param>
		public void AddEntity(Entity ety)
		{
			if(this.m_DataSource == null)
			{
				this.m_DataSource = new DataSet();
				DataTable dt = new DataTable("Table");
				this.m_DataSource.Tables.Add(dt);
			}
			if(this.m_DataSource.Tables[0].Columns.Count == 0)
			{
				string[] Names = ety.GetFieldsName();
				for(int i = 0;i<Names.Length;i++ )
				{
					string dbName = ety.GetDBName(Names[i]);
					m_DataSource.Tables[0].Columns.Add(dbName);
				}
				object[] objValues = ety.GetFieldsValue();
				for(int i = 0 ; i < objValues.Length; i++)
				{
					if(objValues[i] == null || objValues[i].ToString().Length == 0)
					{
						objValues[i] = System.DBNull.Value;
					}
				}
				m_DataSource.Tables[0].Rows.Add(objValues);
				ety.SetIndexInEntitySet(0);
			}
			else
			{
				int i = 0;
				object[] objValues = new object[m_DataSource.Tables[0].Columns.Count];
				foreach(System.Data.DataColumn col in m_DataSource.Tables[0].Columns)
				{
					string dbName = ety.GetDBName(col.ColumnName);
					if(!ety.Attribute.ContainsKey(dbName))
					{
						continue;
					}
					if(ety.Attribute[dbName] != null)
					{
						if(ety.Attribute[dbName].ToString().Length == 0)
						{
							objValues[i] = System.DBNull.Value;
						}
						else
						{
							objValues[i] = ety.Attribute[dbName];
						}
					}
					else
					{
						objValues[i] = System.DBNull.Value;
					}
					i++;
				}
				ety.SetIndexInEntitySet(this.EntityCount);
				this.m_DataSource.Tables[0].Rows.Add(objValues);
			}
		}

		/// <summary>
		/// 将一个实体从EntitySet中删除
		/// </summary>
		/// <param name="ety">需要删除的实体</param>
		public void RemoveEntity(Entity ety)
		{
			if(ety.IndexInEntitySet > -1 && ety.IndexInEntitySet < this.EntityCount)
			{
				m_DataSource.Tables[0].Rows.RemoveAt(ety.IndexInEntitySet);
				//表示实体已不属于该集合
				ety.SetIndexInEntitySet(-1);
			}
		}

		/// <summary>
		/// 清空缓存
		/// </summary>
		public void ClearCache()
		{
			this.m_EntityCache.Clear();
		}

		/// <summary>
		/// 取得实体的数量,该值与DataSourcce属性的Table[0].Rows.Count的值相等
		/// </summary>
		public int EntityCount
		{
			get
			{
				if(this.m_DataSource == null || this.m_DataSource.Tables.Count == 0)
				{
					return 0;
				}
				return m_DataSource.Tables[0].Rows.Count;
			}
		}

		/// <summary>
		/// 取得,设置实体集合对应的表名
		/// </summary>
		public String MappingTableName
		{
			get
			{
				return this.m_MapingTableName;
			}
			set
			{
				this.m_MapingTableName = value;
			}
		}


		/// <summary>
		/// 获取,设置数据集
		/// </summary>
		public DataSet DataSource 
		{ 
			get 
			{
				return this.m_DataSource;
			}
			set
			{
				this.m_DataSource = value;
			}
		}
	}
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -