public static void FetchREFEntity(object objEntity, REFAttribute refAtt, DataTable table) { int rindex = -1;//根据objEntity的Id属性,在table中找到对应的行数 for (int i = 0; i < table.Rows.Count; i++) { if (((BaseEntity)objEntity).Id == Convert.ToInt64(table.Rows[i]["E_" + objEntity.GetType().Name + "Id"])) { rindex = i; break; } } //对象的该引用属性为空值 if (table.Rows[rindex]["E_" + refAtt.REFEntityName + "Id"] == DBNull.Value) { return; } object objRef = DLLAnalysis.GetEntityInstance(refAtt.REFEntityName); ((BaseEntity)objRef).Id = Convert.ToInt64(table.Rows[rindex]["E_" + refAtt.REFEntityName + "Id"]); EntityInfo refeinfo = DLLAnalysis.GetEntityInfoByType(objRef.GetType()); foreach (FieldAttribute fieldAtt in refeinfo.Properties) { FetchPropertyValue(objRef, fieldAtt, table, rindex); } objEntity.GetType().GetProperty(refAtt.PropertyName).SetValue(objEntity, objRef, null); }
/// <summary> /// 根据从数据库检索出的数据集从中组装出实体对象实例 /// </summary> /// <param name="einfo">实体对象媒数据</param> /// <param name="fetchType">关联对象加载方式</param> /// <param name="table">数据集</param> /// <param name="rowIndex">实体对象所处的数据集行数</param> /// <returns>实体对象实例</returns> public static BaseEntity FetchEntity(EntityInfo einfo, Fetch fetchType, DataTable table, int rowIndex) { BaseEntity entity = (BaseEntity)DLLAnalysis.GetEntityInstance(einfo.EntityName); entity.Id = Convert.ToInt64(table.Rows[rowIndex][einfo.IdNameInSelect]); foreach (FieldAttribute pinfo in einfo.Properties) { DBSQLiteHelper.FetchPropertyValue(entity, pinfo, table, rowIndex); } foreach (REFAttribute refAtt in einfo.References) { if ((fetchType == Fetch.Default && !refAtt.LazyLoad) || fetchType == Fetch.REFS || fetchType == Fetch.REFSandSets) { DBSQLiteHelper.FetchREFEntity(entity, refAtt, table); } } foreach (SETAttribute setAtt in einfo.Sets) { if ((fetchType == Fetch.Default && !setAtt.LazyLoad) || fetchType == Fetch.SETS || fetchType == Fetch.REFSandSets) { DBSQLiteHelper.FetchSet(entity, setAtt, table); } } //如果实体有对自身实体对象的引用 if (einfo.REFSelf) { if (fetchType == Fetch.REFS) { FetchParent(entity, table, rowIndex); } else if (fetchType == Fetch.SETS) { FetchChildren(entity, table); } else if (fetchType == Fetch.REFSandSets) { FetchParent(entity, table, rowIndex); FetchChildren(entity, table); } } return(entity); }
/// <summary> /// 获取实体的父对象 /// </summary> /// <param name="objEntity">宿主实体</param> /// <param name="table">数据集</param> /// <param name="rIndex">取数据集的行数</param> public static void FetchParent(object objEntity, DataTable table, int rIndex) { EntityInfo einfo = DLLAnalysis.GetEntityInfoByType(objEntity.GetType()); object pid = table.Rows[rIndex]["PTId"]; if (pid == DBNull.Value || string.IsNullOrEmpty(pid.ToString())) { return; } BaseEntity pEntity = (BaseEntity)DLLAnalysis.GetEntityInstance(einfo.EntityName); pEntity.Id = Convert.ToInt64(pid); try { pEntity.GetType().GetProperty(einfo.Properties[0].FieldName).SetValue(pEntity, table.Rows[rIndex]["PTC"], null); objEntity.GetType().GetProperty("Parent" + einfo.EntityName).SetValue(objEntity, pEntity, null); } catch (Exception ex) { } return; }
/// <summary> /// 返回即将要执行的SQL语句 /// </summary> public void Update(List <string> listsql) { if (this.Id == 0) { throw new OOEngineException("此对象尚未被持久化,请先执行新增操作后再执行此方法!"); } string sqlPattern = "update {0} set {1} where Id={2};"; StringBuilder sbSetValue = new StringBuilder(); foreach (FieldAttribute pinfo in EInfo.Properties) { if (sbSetValue.Length > 0) { sbSetValue.Append(","); } sbSetValue.Append(string.Format("{0}={1}", pinfo.FieldName, DLLAnalysis.GetPropertyValue(this, pinfo))); } foreach (REFAttribute refobj in EInfo.References) { if (sbSetValue.Length > 0) { sbSetValue.Append(","); } sbSetValue.Append(string.Format("{0}={1}", refobj.REFFieldName, DLLAnalysis.GetReferenceEntityId(this, refobj.PropertyName))); } if (EInfo.REFSelf) { if (sbSetValue.Length > 0) { sbSetValue.Append(","); } sbSetValue.Append(string.Format("ParentId={0}", DLLAnalysis.GetReferenceEntityId(this, "Parent" + EInfo.EntityName))); } string sql = string.Format(sqlPattern, EInfo.EntityName, sbSetValue.ToString(), this.Id); if (listsql != null) { listsql.Add(sql); } }
/// <summary> /// 将字符串类型的数据经转换后付给指定的实体对象 /// </summary> /// <param name="objEntity">实体对象</param> /// <param name="pinfo">需要赋值的属性名称</param> /// <param name="table">字符串值</param> public static void FetchPropertyValue(object objEntity, string fieldName, string propValue) { if (string.IsNullOrEmpty(propValue)) { return; } EntityInfo einfo = DLLAnalysis.GetEntityInfoByType(objEntity.GetType()); FieldAttribute fieldAtt = null; foreach (FieldAttribute fatt in einfo.Properties) { if (fatt.FieldName.Equals(fieldName)) { fieldAtt = fatt; break; } } if (fieldAtt.DataType.StartsWith("string") || fieldAtt.DataType.IndexOf("text") > -1) { objEntity.GetType().GetProperty(fieldName).SetValue(objEntity, propValue, null); } else { switch (fieldAtt.DataType) { case "int": objEntity.GetType().GetProperty(fieldName).SetValue(objEntity, Convert.ToInt32(propValue), null); break; case "long": objEntity.GetType().GetProperty(fieldName).SetValue(objEntity, Convert.ToInt64(propValue), null); break; case "float": objEntity.GetType().GetProperty(fieldName).SetValue(objEntity, Convert.ToSingle(propValue), null); break; case "decimal": objEntity.GetType().GetProperty(fieldName).SetValue(objEntity, Convert.ToDecimal(propValue), null); break; case "Date": case "SmallDate": objEntity.GetType().GetProperty(fieldName).SetValue(objEntity, Convert.ToDateTime(propValue), null); break; } } }
public static void FetchChildren(object objEntity, DataTable table) { EntityInfo einfo = DLLAnalysis.GetEntityInfoByType(objEntity.GetType()); ArrayList list = new ArrayList(); for (int i = 0; i < table.Rows.Count; i++) { //如果该实体的此集合属性为空 if (table.Rows[i]["CTId"] == DBNull.Value || table.Rows[i]["CTPId"] == DBNull.Value) { continue; } if (((BaseEntity)objEntity).Id == Convert.ToInt64(table.Rows[i]["CTPId"])) { object objElement = DLLAnalysis.GetEntityInstance(einfo.EntityName); //取自身引用子集合时,每个子对象只有Id是载入的,其他属性都没获取 ((BaseEntity)objElement).Id = Convert.ToInt64(table.Rows[i]["CTId"]); //objElement.GetType().GetProperty(einfo.Properties[0].FieldName).SetValue(objElement, table.Rows[i]["CTC"], null); list.Add(objElement); } } objEntity.GetType().GetProperty("Child" + einfo.EntityName + "s").SetValue(objEntity, list, null); }
public static void FetchSet(object objEntity, SETAttribute setAtt, DataTable table) { ArrayList list = new ArrayList(); for (int i = 0; i < table.Rows.Count; i++) { //如果该实体的此集合属性为空 if (table.Rows[i][setAtt.ElementEntityId] == DBNull.Value) { continue; } if (((BaseEntity)objEntity).Id == Convert.ToInt64(table.Rows[i][setAtt.ElementEntityId])) { object objElement = DLLAnalysis.GetEntityInstance(setAtt.ElementEntityName); if (Convert.IsDBNull(table.Rows[i]["E_" + setAtt.ElementEntityName + "Id"])) { continue; } ((BaseEntity)objElement).Id = Convert.ToInt64(table.Rows[i]["E_" + setAtt.ElementEntityName + "Id"]); EntityInfo elementEinfo = DLLAnalysis.GetEntityInfoByType(objElement.GetType()); foreach (FieldAttribute fieldAtt in elementEinfo.Properties) { FetchPropertyValue(objElement, fieldAtt, table, i); } foreach (REFAttribute refAtt in elementEinfo.References) { if (refAtt.REFEntityName.Equals(objEntity.GetType().Name)) { objElement.GetType().GetProperty(refAtt.PropertyName).SetValue(objElement, objEntity, null); } } list.Add(objElement); } } objEntity.GetType().GetProperty(setAtt.PropertyName).SetValue(objEntity, list, null); }
/// <summary> /// 执行事务操作时候返回将要执行的SQL语句 /// </summary> public void Insert(List <string> listsql) { if (this.Id > 0) { throw new OOEngineException("对象已经被持久化,不能在此对象上执行新增操作!"); } //try //{ string sqlPattern = "insert into {0}({1}) values({2});select last_insert_rowid() newid;"; StringBuilder sbFieldNameList = new StringBuilder(); StringBuilder sbFieldValueList = new StringBuilder(); //常规属性 foreach (FieldAttribute pinfo in EInfo.Properties) { if (sbFieldNameList.Length > 0) { sbFieldNameList.Append(","); } sbFieldNameList.Append(pinfo.FieldName); if (sbFieldValueList.Length > 0) { sbFieldValueList.Append(","); } sbFieldValueList.Append(DLLAnalysis.GetPropertyValue(this, pinfo)); } //引用属性 foreach (REFAttribute refobj in EInfo.References) { if (sbFieldNameList.Length > 0) { sbFieldNameList.Append(","); } //将实体中的REFEntityName转变为数据库表的字段EntityNameId sbFieldNameList.Append(refobj.REFFieldName); if (sbFieldValueList.Length > 0) { sbFieldValueList.Append(","); } sbFieldValueList.Append(DLLAnalysis.GetReferenceEntityId(this, refobj.PropertyName)); } if (EInfo.REFSelf) { if (sbFieldNameList.Length > 0) { sbFieldNameList.Append(","); } //将实体中的REFEntityName转变为数据库表的字段EntityNameId sbFieldNameList.Append("ParentId"); if (sbFieldValueList.Length > 0) { sbFieldValueList.Append(","); } sbFieldValueList.Append(DLLAnalysis.GetReferenceEntityId(this, "Parent" + EInfo.EntityName)); } string sql = string.Format(sqlPattern, EInfo.EntityName, sbFieldNameList.ToString(), sbFieldValueList.ToString()); if (listsql != null) { listsql.Add(sql); } }
/// <summary> /// 将新创建的实体插入数据库,如果该实体并不是新建的,则会抛出异常 /// </summary> public virtual void Insert() { if (this.Id > 0) { throw new OOEngineException("对象已经被持久化,不能在此对象上执行新增操作!"); } //try //{ string sqlPattern = "insert into {0}({1}) values({2});select last_insert_rowid() newid;"; StringBuilder sbFieldNameList = new StringBuilder(); StringBuilder sbFieldValueList = new StringBuilder(); //常规属性 foreach (FieldAttribute pinfo in EInfo.Properties) { if (sbFieldNameList.Length > 0) { sbFieldNameList.Append(","); } sbFieldNameList.Append(pinfo.FieldName); if (sbFieldValueList.Length > 0) { sbFieldValueList.Append(","); } sbFieldValueList.Append(DLLAnalysis.GetPropertyValue(this, pinfo)); } //引用属性 foreach (REFAttribute refobj in EInfo.References) { if (sbFieldNameList.Length > 0) { sbFieldNameList.Append(","); } //将实体中的REFEntityName转变为数据库表的字段EntityNameId sbFieldNameList.Append(refobj.REFFieldName); if (sbFieldValueList.Length > 0) { sbFieldValueList.Append(","); } sbFieldValueList.Append(DLLAnalysis.GetReferenceEntityId(this, refobj.PropertyName)); } if (EInfo.REFSelf) { if (sbFieldNameList.Length > 0) { sbFieldNameList.Append(","); } //将实体中的REFEntityName转变为数据库表的字段EntityNameId sbFieldNameList.Append("ParentId"); if (sbFieldValueList.Length > 0) { sbFieldValueList.Append(","); } sbFieldValueList.Append(DLLAnalysis.GetReferenceEntityId(this, "Parent" + EInfo.EntityName)); } string sql = string.Format(sqlPattern, EInfo.EntityName, sbFieldNameList.ToString(), sbFieldValueList.ToString()); int newid = DBSQLiteHelper.ExecuteScalar(sql); this.Id = Convert.ToInt64(newid); //} //catch (Exception e) //{ // throw new OOEngineException("在持久化新实体对象时发生异常,地址:BaseEntity.Insert(),具体信息:"+e.Message); //} }