PageRenderTime 40ms CodeModel.GetById 25ms RepoModel.GetById 1ms app.codeStats 0ms

/branches/ImplementingSubAssemblyRegistration/code/DomainDriver.DomainModeling.Example/DomainObjects/DummyDomainObject.Storage.cs

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