/// <summary> /// Deletes the row by the specified primary key value. /// </summary> /// <param name="primaryKeyValue">The primary key value.</param> /// <returns>Number of affected rows</returns> public int Delete(object primaryKeyValue) { IQueryCriteriaGenerator queryCriteriaGenerator = null; DataFactory factory = new DataFactory(); int affectedRows = 0; ExecutionEngine exec = null; try { queryCriteriaGenerator = factory.InitializeQueryCriteriaGenerator(database); DatabaseField field = mappedObject.GetPrimaryKeyField(); field.fieldValue = primaryKeyValue; QueryCriteria criteria = new QueryCriteria(mappedObject.TableName); criteria.Add(CriteriaOperator.Equality, field, primaryKeyValue); ExecutionQuery query = queryCriteriaGenerator.GenerateDelete(criteria); if (contextSession != null) { if (contextSession.IsInTransaction) { contextSession.Queries.Add(query); } else { affectedRows = execEngine.ExecuteNonQuery(query); } } else { exec = new ExecutionEngine(); affectedRows = exec.ExecuteNonQuery(query); } return(affectedRows); } finally { if (exec != null) { exec.Dispose(); } } }
private object RunIntrinsecFunction(CriteriaOperator criteria, DatabaseField field) { IQueryCriteriaGenerator iql = null; object result; ExecutionEngine exec = null; try { QueryCriteria qc = new QueryCriteria(mappedObject.TableName, field); qc.Add(criteria, field); DataFactory factory = new DataFactory(); iql = factory.InitializeQueryCriteriaGenerator(database); ExecutionQuery query = iql.GenerateSelect(qc); if (contextSession != null) { result = execEngine.ExecuteScalar(query); } else { exec = new ExecutionEngine(); result = exec.ExecuteScalar(database, connectionString, query); } return(result); } finally { if (exec != null) { exec.Dispose(); } } }
/// <summary> /// Gets the data from a related table in a ManyToMany relation. /// </summary> /// <param name="relatedTableType">Type of the related entity</param> /// <param name="intermediaryRelatedTableType">Type of the intermediary table</param> /// <returns>TableMetadata array which contains the results</returns> protected Array GetRelatedTableData(Type relatedTableType, Type intermediaryRelatedTableType) { PersistentObject persistent = null; ManyToManyTableRelation relation = null; DataSet ds = null; try { //create a instance of the table so we can check the relations between out table and this TableMetadata relatedTable = (TableMetadata)Activator.CreateInstance(relatedTableType); TableMetadata intermediateTable = (TableMetadata)Activator.CreateInstance(intermediaryRelatedTableType); object primaryKeyValue = GetPrimaryKeyField().fieldValue; //first check the fieldValue of the primary key if (GetPrimaryKeyField().fieldValue == null) { throw new InvalidOperationException("The primary key does not have a fieldValue"); } //get the relation foreach (TableRelation var in Relations) { if (var is ManyToManyTableRelation) { if (var.RelatedTableName == relatedTable.TableName) { relation = (ManyToManyTableRelation)var; break; } } } //check if we got the relation if (relation == null) { throw new ArgumentException("A relation cannot be found between the tables"); } //we have the relation between the 2 tables. persistent = new PersistentObject(this); QueryCriteria qcThis = new QueryCriteria(TableName, GetPrimaryKeyField()); qcThis.Add(CriteriaOperator.Equality, GetPrimaryKeyField(), primaryKeyValue); //generate here the inner join QueryCriteria qcIntermediaryTable = new QueryCriteria(intermediateTable.TableName, intermediateTable.GetField(relation.IntermediaryKeyFieldFromParentTable)); QueryCriteria qcChild = new QueryCriteria(relatedTable); qcThis.AddJoin(JoinType.Inner, TableName, GetPrimaryKeyField(), intermediateTable.TableName, intermediateTable.GetField(relation.IntermediaryKeyFieldFromParentTable), qcIntermediaryTable); qcThis.AddJoin(JoinType.Inner, intermediateTable.TableName, intermediateTable.GetField(relation.IntermediaryKeyFieldFromChildTable), relatedTable.TableName, relatedTable.GetField(relation.IntermediaryKeyFieldFromChildTable), qcChild); ds = persistent.GetDataSet(qcThis); Array data = Array.CreateInstance(relatedTableType, ds.Tables[0].Rows.Count); for (int i = 0; i < data.Length; i++) { object instance = Activator.CreateInstance(relatedTableType); data.SetValue(instance, i); //loop thru dataset for (int j = START_INDEX_FIELD; j < ds.Tables[0].Columns.Count; j++) { Type tp = data.GetValue(i).GetType(); object[] args = new[] { ds.Tables[0].Columns[j].ColumnName, ds.Tables[0].Rows[i][j] }; tp.InvokeMember("SetFieldValue", BindingFlags.InvokeMethod | BindingFlags.Public | BindingFlags.Instance, null, instance, args); } } return(data); } catch { throw; } finally { if (ds != null) { ds.Dispose(); } } }