📄 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 + -