/branches/2012_08_17_EF5_Upgrade/code/DomainDriver.DomainModeling.Example/DomainObjects/DummyDomainObject.Storage.cs

# · C# · 223 lines · 186 code · 37 blank · 0 comment · 17 complexity · 0298fff0f39a9c14f67ff5af4af05bed MD5 · raw file

  1. using System;
  2. using System.Collections.Generic;
  3. using System.ComponentModel.DataAnnotations;
  4. using System.ComponentModel.DataAnnotations.Schema;
  5. using System.Data;
  6. using System.Data.Entity;
  7. using System.Linq;
  8. using System.Linq.Expressions;
  9. using System.Text;
  10. using DomainDriver.DomainModeling.DataProviders;
  11. using DomainDriver.DomainModeling.DomainObjects;
  12. using DomainDriver.DomainModeling.Queries;
  13. using DomainDriver.DomainModeling.StorageManagers.DataSetStorage;
  14. using DomainDriver.DomainModeling.StorageManagers.EntityFrameworkStorage;
  15. using ObjectRow = DomainDriver.DomainModeling.Example.ExampleModelDataSet.DummyDomainObjectsRow;
  16. using RelationRow = DomainDriver.DomainModeling.Example.ExampleModelDataSet.DummyDomainObjectRelationsRow;
  17. namespace DomainDriver.DomainModeling.Example.DomainObjects
  18. {
  19. public partial class DummyDomainObject : IEfEntity<Guid>, IEfAggregate<DummyDomainObject>, IDataSetSerializable<DataSet, DataRow>, IDataSetSerializable<ExampleModelDataSet, DataRow>, IDataSetSerializable<ExampleModelDataSet, ObjectRow>
  20. {
  21. #region Entity Framework CTP5 Serialization Code
  22. [Key]
  23. [DatabaseGenerated(DatabaseGeneratedOption.None)]
  24. public Guid EF_Id
  25. {
  26. get { return m_Key; }
  27. set { m_Key = value; }
  28. }
  29. [NotMapped]
  30. public ICollection<DummyDomainObjectRelation> EF_Children
  31. {
  32. get { return m_Children.Values; }
  33. set
  34. {
  35. m_Children.Clear();
  36. foreach (DummyDomainObjectRelation relation in value)
  37. {
  38. m_Children.Add(relation.ChildId, relation);
  39. }
  40. }
  41. }
  42. ICollection<QuerySpecification> IEfAggregate<DummyDomainObject>.OverriddenQueries
  43. {
  44. get
  45. {
  46. List<QuerySpecification> specifications = new List<QuerySpecification>();
  47. specifications.Add(new QuerySpecification(typeof(ContainsQuery<DummyDomainObject>), new string[] { "Children" }));
  48. return specifications;
  49. }
  50. }
  51. bool IEfAggregate<DummyDomainObject>.SearchNestedAggregateValues(DbContext context, IParameterizedQuery<DummyDomainObject> query)
  52. {
  53. IDictionary<string, object> parameterValues = query.ParameterValues;
  54. int containsParameterCount = 1;
  55. string containsParameterName = "Children";
  56. if ((query is ContainsQuery<DummyDomainObject>) && (parameterValues.Count == containsParameterCount) && (parameterValues.ContainsKey(containsParameterName)))
  57. {
  58. Guid childId = (Guid)parameterValues[containsParameterName];
  59. Expression<Func<DummyDomainObjectRelation, bool>> childQueryExpression = ((DummyDomainObjectRelation rel) => ((rel.ParentId == this.Key) && (rel.ChildId == childId)));
  60. IEnumerable<DummyDomainObjectRelation> childQueryResults = context.Set<DummyDomainObjectRelation>().Where<DummyDomainObjectRelation>(childQueryExpression.Compile());
  61. bool containsChild = (childQueryResults.Count<DummyDomainObjectRelation>() > 0);
  62. return containsChild;
  63. }
  64. throw new NotImplementedException();
  65. }
  66. void IEfAggregate<DummyDomainObject>.ReadNestedAggregateValues(DbContext context, object rootQueryPredicate, Dictionary<string, object> batchReadState)
  67. {
  68. IQueryable<DummyDomainObjectRelation> relations = context.Set<DummyDomainObjectRelation>().Where<DummyDomainObjectRelation>((DummyDomainObjectRelation rel) => rel.ParentId == this.Key);
  69. List<DummyDomainObjectRelation> relationList = new List<DummyDomainObjectRelation>(relations);
  70. this.EF_Children = relationList;
  71. }
  72. void IEfAggregate<DummyDomainObject>.AddNestedAggregateValues(DbContext context)
  73. {
  74. Expression<Func<ICollection<DummyDomainObjectRelation>>> nestedObjectsGetterExpression = () => this.EF_Children;
  75. EfAggregateUtilities.AddNestedValues<DummyDomainObjectRelation>(context, nestedObjectsGetterExpression);
  76. }
  77. void IEfAggregate<DummyDomainObject>.UpdateNestedAggregateValues(DbContext context, DummyDomainObject originalAggregateRoot)
  78. {
  79. Expression<Func<DummyDomainObjectRelation, Guid>> keyGetterExpression = (DummyDomainObjectRelation nestedObj) => nestedObj.ChildId;
  80. Expression<Func<DummyDomainObjectRelation, DummyDomainObjectRelation, bool>> nestedObjectsMatchExpression = (DummyDomainObjectRelation obj1, DummyDomainObjectRelation obj2) => ((obj1.ParentId == obj2.ParentId) && (obj1.ChildId == obj2.ChildId));
  81. Expression<Func<DummyDomainObject, IDictionary<Guid, DummyDomainObjectRelation>>> dictionaryGetterExpression = (DummyDomainObject agg) => agg.m_Children;
  82. EfAggregateUtilities.UpdateNestedValues<DummyDomainObject, Guid, DummyDomainObjectRelation>(context, this, originalAggregateRoot, keyGetterExpression, nestedObjectsMatchExpression, dictionaryGetterExpression);
  83. }
  84. void IEfAggregate<DummyDomainObject>.DeleteNestedAggregateValues(DbContext context)
  85. {
  86. Expression<Func<DummyDomainObjectRelation, bool>> deleteQueryExpression = ((DummyDomainObjectRelation rel) => (rel.ParentId == this.Key));
  87. EfAggregateUtilities.DeleteNestedValues(context, deleteQueryExpression);
  88. }
  89. #endregion
  90. #region DataSet Serialization Methods
  91. public void Serialize(DataSet dataSource, DataRow objectRow)
  92. {
  93. string keyColumnName = ExampleModelDataSet.SchemaHelper.DummyDomainObjects.DummyDomainObjectIdColumn.ColumnName;
  94. string indexColumnName = ExampleModelDataSet.SchemaHelper.DummyDomainObjects.IndexColumn.ColumnName;
  95. string nameColumnName = ExampleModelDataSet.SchemaHelper.DummyDomainObjects.NameColumn.ColumnName;
  96. string parentIdColumnName = ExampleModelDataSet.SchemaHelper.DummyDomainObjects.ParentDummyDomainObjectIdColumn.ColumnName;
  97. objectRow[keyColumnName] = m_Key;
  98. objectRow[indexColumnName] = m_Index;
  99. objectRow[nameColumnName] = m_Name;
  100. objectRow.SerializeNullableField<Guid>(m_Parent, ExampleModelDataSet.SchemaHelper.DummyDomainObjects.ParentDummyDomainObjectIdColumn);
  101. string subTableName = ExampleModelDataSet.SchemaHelper.DummyDomainObjectRelations.TableName;
  102. string subParentIdColumnName = ExampleModelDataSet.SchemaHelper.DummyDomainObjectRelations.ParentDummyDomainObjectIdColumn.ColumnName;
  103. string subChildIdColumnName = ExampleModelDataSet.SchemaHelper.DummyDomainObjectRelations.ChildDummyDomainObjectIdColumn.ColumnName;
  104. DataTable relationTable = dataSource.Tables[subTableName];
  105. foreach (DummyDomainObjectRelation relation in m_Children.Values)
  106. {
  107. DataRow relationRow = relationTable.NewRow();
  108. relationRow[subParentIdColumnName] = relation.ParentId;
  109. relationRow[subChildIdColumnName] = relation.ChildId;
  110. relationTable.Rows.Add(relationRow);
  111. }
  112. }
  113. public void Deserialize(DataSet dataSource, DataRow objectRow)
  114. {
  115. string keyColumnName = ExampleModelDataSet.SchemaHelper.DummyDomainObjects.DummyDomainObjectIdColumn.ColumnName;
  116. string indexColumnName = ExampleModelDataSet.SchemaHelper.DummyDomainObjects.IndexColumn.ColumnName;
  117. string nameColumnName = ExampleModelDataSet.SchemaHelper.DummyDomainObjects.NameColumn.ColumnName;
  118. string parentIdColumnName = ExampleModelDataSet.SchemaHelper.DummyDomainObjects.ParentDummyDomainObjectIdColumn.ColumnName;
  119. m_Key = objectRow.Field<Guid>(keyColumnName);
  120. m_Index = objectRow.Field<int>(indexColumnName);
  121. m_Name = objectRow.Field<string>(nameColumnName);
  122. objectRow.DeserializeNullableField<Guid>(out m_Parent, ExampleModelDataSet.SchemaHelper.DummyDomainObjects.ParentDummyDomainObjectIdColumn);
  123. string subTableName = ExampleModelDataSet.SchemaHelper.DummyDomainObjectRelations.TableName;
  124. string subParentIdColumnName = ExampleModelDataSet.SchemaHelper.DummyDomainObjectRelations.ParentDummyDomainObjectIdColumn.ColumnName;
  125. string subChildIdColumnName = ExampleModelDataSet.SchemaHelper.DummyDomainObjectRelations.ChildDummyDomainObjectIdColumn.ColumnName;
  126. DataTable relationTable = dataSource.Tables[subTableName];
  127. string selectStmt = string.Format("{0} = '{1}'", subParentIdColumnName, m_Key.ToString());
  128. foreach (DataRow relationRow in relationTable.Select(selectStmt))
  129. {
  130. if (relationRow.IsNull(subParentIdColumnName))
  131. { throw new ApplicationException(); }
  132. if (relationRow.Field<Guid>(subParentIdColumnName) != m_Key)
  133. { throw new ApplicationException(); }
  134. Guid childId = relationRow.Field<Guid>(subChildIdColumnName);
  135. m_Children.Add(childId, new DummyDomainObjectRelation(m_Key, childId));
  136. }
  137. }
  138. #endregion
  139. #region ExampleModelDataSet Serialization Methods
  140. public string ObjectTableName
  141. {
  142. get { return ExampleModelDataSet.SchemaHelper.DummyDomainObjects.TableName; }
  143. }
  144. public string KeyColumnName
  145. {
  146. get { return ExampleModelDataSet.SchemaHelper.DummyDomainObjects.DummyDomainObjectIdColumn.ColumnName; }
  147. }
  148. public void Serialize(ExampleModelDataSet dataSource, DataRow objectRow)
  149. {
  150. Serialize(dataSource, objectRow as ObjectRow);
  151. }
  152. public void Serialize(ExampleModelDataSet dataSource, ObjectRow objectRow)
  153. {
  154. objectRow.DummyDomainObjectId = m_Key;
  155. objectRow.Index = m_Index;
  156. objectRow.Name = m_Name;
  157. objectRow.SerializeNullableField<Guid>(m_Parent, ExampleModelDataSet.SchemaHelper.DummyDomainObjects.ParentDummyDomainObjectIdColumn);
  158. foreach (DummyDomainObjectRelation relation in m_Children.Values)
  159. {
  160. RelationRow relationRow = dataSource.DummyDomainObjectRelations.NewDummyDomainObjectRelationsRow();
  161. relationRow.ParentDummyDomainObjectId = relation.ParentId;
  162. relationRow.ChildDummyDomainObjectId = relation.ChildId;
  163. dataSource.DummyDomainObjectRelations.AddDummyDomainObjectRelationsRow(relationRow);
  164. }
  165. }
  166. public void Deserialize(ExampleModelDataSet dataSource, DataRow objectRow)
  167. {
  168. Deserialize(dataSource, objectRow as ObjectRow);
  169. }
  170. public void Deserialize(ExampleModelDataSet dataSource, ObjectRow objectRow)
  171. {
  172. m_Key = objectRow.DummyDomainObjectId;
  173. m_Index = objectRow.Index;
  174. m_Name = objectRow.Name;
  175. objectRow.DeserializeNullableField<Guid>(out m_Parent, ExampleModelDataSet.SchemaHelper.DummyDomainObjects.ParentDummyDomainObjectIdColumn);
  176. foreach (RelationRow relationRow in objectRow.GetDummyDomainObjectRelationsRowsByDummyDomainObjects_DummyDomainObjects_Children_Parent())
  177. {
  178. if (relationRow.ParentDummyDomainObjectId != m_Key)
  179. { throw new ApplicationException(); }
  180. Guid childId = relationRow.ChildDummyDomainObjectId;
  181. m_Children.Add(childId, new DummyDomainObjectRelation(m_Key, childId));
  182. }
  183. }
  184. #endregion
  185. }
  186. }