?? entityset.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 + -