PageRenderTime 59ms CodeModel.GetById 20ms RepoModel.GetById 0ms app.codeStats 0ms

/SolutionFramework/Microsoft.VisualStudio.ServiceModel.DomainServices.Tools.10.0/Microsoft/VisualStudio/ServiceModel/DomainServices/Tools/LinqToEntitiesDbContext.cs

#
C# | 237 lines | 223 code | 14 blank | 0 comment | 27 complexity | cbaf77324c41efca5feb5b3862c9898a MD5 | raw file
Possible License(s): Apache-2.0, LGPL-3.0
  1. namespace Microsoft.VisualStudio.ServiceModel.DomainServices.Tools
  2. {
  3. using Microsoft.ServiceModel.DomainServices.Tools;
  4. using System;
  5. using System.CodeDom;
  6. using System.Data;
  7. using System.Data.Mapping;
  8. using System.Data.Metadata.Edm;
  9. using System.Data.Objects;
  10. using System.Globalization;
  11. using System.Reflection;
  12. using System.ServiceModel.DomainServices;
  13. internal class LinqToEntitiesDbContext : LinqToEntitiesContextBase
  14. {
  15. private bool? _isCodeFirstModel;
  16. private System.Data.Metadata.Edm.MetadataWorkspace _metadataWorkspace;
  17. public LinqToEntitiesDbContext(Type contextType) : base(contextType)
  18. {
  19. this._isCodeFirstModel = null;
  20. }
  21. protected override CodeTypeDeclaration CreateBusinessLogicClass(CodeGenContext codeGenContext, CodeNamespace codeNamespace, string className)
  22. {
  23. foreach (string str in BusinessLogicClassConstants.LinqToEntitiesDbImports)
  24. {
  25. codeNamespace.Imports.Add(new CodeNamespaceImport(str));
  26. }
  27. if (base.ContextType.Namespace != codeNamespace.Name)
  28. {
  29. codeNamespace.Imports.Add(new CodeNamespaceImport("System.ServiceModel.DomainServices.EntityFramework"));
  30. codeNamespace.Imports.Add(new CodeNamespaceImport(base.ContextType.Namespace));
  31. }
  32. codeGenContext.AddReference(typeof(EntityState).Assembly.FullName);
  33. codeGenContext.AddReference("Microsoft.ServiceModel.DomainServices.EntityFramework, Version=4.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35");
  34. if (DbContextUtilities.DbContextTypeReference != null)
  35. {
  36. codeGenContext.AddReference(DbContextUtilities.DbContextTypeReference.Assembly.FullName);
  37. }
  38. CodeTypeDeclaration declaration = CodeGenUtilities.CreateTypeDeclaration(className, codeNamespace.Name);
  39. CodeTypeReference reference = new CodeTypeReference(BusinessLogicClassConstants.DbDomainServiceTypeName, new CodeTypeReference[] { new CodeTypeReference(base.ContextType.Name) });
  40. declaration.BaseTypes.Add(reference);
  41. return declaration;
  42. }
  43. protected override void GenerateDeleteMethod(CodeGenContext codeGenContext, CodeTypeDeclaration businessLogicClass, BusinessLogicEntity entity)
  44. {
  45. string name = CodeGenUtilities.MakeLegalParameterName(entity.Name);
  46. CodeMemberMethod method = new CodeMemberMethod();
  47. businessLogicClass.Members.Add(method);
  48. LinqToEntitiesEntity efDbEntity = (LinqToEntitiesEntity) entity;
  49. method.Name = "Delete" + CodeGenUtilities.MakeLegalEntityName(entity.Name);
  50. method.Attributes = MemberAttributes.Public | MemberAttributes.Final;
  51. method.Parameters.Add(new CodeParameterDeclarationExpression(entity.ClrType.Name, name));
  52. CodeArgumentReferenceExpression expression = new CodeArgumentReferenceExpression(name);
  53. CodeExpression contextReferenceExpression = GetContextReferenceExpression();
  54. CodeVariableDeclarationStatement statement = new CodeVariableDeclarationStatement(new CodeTypeReference("DbEntityEntry", new CodeTypeReference[] { new CodeTypeReference(entity.ClrType.Name) }), "entityEntry", new CodeMethodInvokeExpression(new CodeMethodReferenceExpression(contextReferenceExpression, "Entry"), new CodeExpression[] { expression }));
  55. method.Statements.Add(statement);
  56. CodeVariableReferenceExpression targetObject = new CodeVariableReferenceExpression("entityEntry");
  57. CodePropertyReferenceExpression left = new CodePropertyReferenceExpression(targetObject, "State");
  58. CodeFieldReferenceExpression right = new CodeFieldReferenceExpression(new CodeTypeReferenceExpression(typeof(EntityState).Name), Enum.GetName(typeof(EntityState), EntityState.Deleted));
  59. CodeExpression condition = CodeGenUtilities.MakeNotEqual(typeof(EntityState), left, right, codeGenContext.IsCSharp);
  60. CodeFieldReferenceExpression expression7 = new CodeFieldReferenceExpression(new CodeTypeReferenceExpression(typeof(EntityState).Name), Enum.GetName(typeof(EntityState), EntityState.Deleted));
  61. CodeAssignStatement statement2 = new CodeAssignStatement(left, expression7);
  62. CodeMethodInvokeExpression expression8 = new CodeMethodInvokeExpression(GetDbSetReferenceExpression(efDbEntity), "Attach", new CodeExpression[] { expression });
  63. CodeMethodInvokeExpression expression9 = new CodeMethodInvokeExpression(GetDbSetReferenceExpression(efDbEntity), "Remove", new CodeExpression[] { expression });
  64. CodeConditionStatement statement3 = new CodeConditionStatement(condition, new CodeStatement[] { statement2 }, new CodeStatement[] { new CodeExpressionStatement(expression8), new CodeExpressionStatement(expression9) });
  65. method.Statements.Add(statement3);
  66. }
  67. protected override void GenerateInsertMethod(CodeGenContext codeGenContext, CodeTypeDeclaration businessLogicClass, BusinessLogicEntity entity)
  68. {
  69. CodeMemberMethod method = new CodeMemberMethod();
  70. businessLogicClass.Members.Add(method);
  71. string name = CodeGenUtilities.MakeLegalParameterName(entity.Name);
  72. LinqToEntitiesEntity efDbEntity = (LinqToEntitiesEntity) entity;
  73. method.Name = "Insert" + CodeGenUtilities.MakeLegalEntityName(entity.Name);
  74. method.Attributes = MemberAttributes.Public | MemberAttributes.Final;
  75. method.Parameters.Add(new CodeParameterDeclarationExpression(entity.ClrType.Name, name));
  76. CodeArgumentReferenceExpression expression = new CodeArgumentReferenceExpression(name);
  77. CodeExpression contextReferenceExpression = GetContextReferenceExpression();
  78. CodeVariableDeclarationStatement statement = new CodeVariableDeclarationStatement(new CodeTypeReference("DbEntityEntry", new CodeTypeReference[] { new CodeTypeReference(entity.ClrType.Name) }), "entityEntry", new CodeMethodInvokeExpression(new CodeMethodReferenceExpression(contextReferenceExpression, "Entry"), new CodeExpression[] { expression }));
  79. method.Statements.Add(statement);
  80. CodeVariableReferenceExpression targetObject = new CodeVariableReferenceExpression("entityEntry");
  81. CodePropertyReferenceExpression left = new CodePropertyReferenceExpression(targetObject, "State");
  82. CodeFieldReferenceExpression right = new CodeFieldReferenceExpression(new CodeTypeReferenceExpression(typeof(EntityState).Name), Enum.GetName(typeof(EntityState), EntityState.Detached));
  83. CodeExpression condition = CodeGenUtilities.MakeNotEqual(typeof(EntityState), left, right, codeGenContext.IsCSharp);
  84. CodeFieldReferenceExpression expression7 = new CodeFieldReferenceExpression(new CodeTypeReferenceExpression(typeof(EntityState).Name), Enum.GetName(typeof(EntityState), EntityState.Added));
  85. CodeAssignStatement statement2 = new CodeAssignStatement(left, expression7);
  86. CodeMethodInvokeExpression expression8 = new CodeMethodInvokeExpression(GetDbSetReferenceExpression(efDbEntity), "Add", new CodeExpression[] { expression });
  87. CodeConditionStatement statement3 = new CodeConditionStatement(condition, new CodeStatement[] { statement2 }, new CodeStatement[] { new CodeExpressionStatement(expression8) });
  88. method.Statements.Add(statement3);
  89. }
  90. protected override CodeMemberMethod GenerateSelectMethod(CodeGenContext codeGenContext, CodeTypeDeclaration businessLogicClass, BusinessLogicEntity entity)
  91. {
  92. CodeMemberMethod method = null;
  93. LinqToEntitiesEntity entity2 = entity as LinqToEntitiesEntity;
  94. if ((entity2 != null) && (entity2.DefaultObjectSetName != null))
  95. {
  96. method = new CodeMemberMethod();
  97. businessLogicClass.Members.Add(method);
  98. method.Comments.Add(new CodeCommentStatement(Resources.BusinessLogicClass_Query_Method_Remarks, false));
  99. string text = string.Format(CultureInfo.CurrentCulture, Resources.BusinessLogicClass_Query_Method_EF_Remarks, new object[] { entity2.DefaultObjectSetName });
  100. method.Comments.Add(new CodeCommentStatement(text, false));
  101. method.Name = "Get" + CodeGenUtilities.MakeLegalEntityName(entity2.DefaultObjectSetName);
  102. method.ReturnType = new CodeTypeReference("IQueryable", new CodeTypeReference[] { new CodeTypeReference(entity.Name) });
  103. method.Attributes = MemberAttributes.Public | MemberAttributes.Final;
  104. CodeExpression expression = new CodePropertyReferenceExpression(GetContextReferenceExpression(), entity2.DefaultObjectSetName);
  105. CodeMethodReturnStatement statement = new CodeMethodReturnStatement(expression);
  106. method.Statements.Add(statement);
  107. }
  108. return method;
  109. }
  110. protected override void GenerateUpdateMethod(CodeGenContext codeGenContext, CodeTypeDeclaration businessLogicClass, BusinessLogicEntity entity)
  111. {
  112. string name = "current" + entity.ClrType.Name;
  113. CodeMemberMethod method = new CodeMemberMethod();
  114. businessLogicClass.Members.Add(method);
  115. method.Name = "Update" + CodeGenUtilities.MakeLegalEntityName(entity.Name);
  116. method.Attributes = MemberAttributes.Public | MemberAttributes.Final;
  117. method.Parameters.Add(new CodeParameterDeclarationExpression(entity.ClrType.Name, name));
  118. LinqToEntitiesEntity entity2 = (LinqToEntitiesEntity) entity;
  119. if (!entity2.HasTimestampMember)
  120. {
  121. CodeExpression targetObject = new CodePropertyReferenceExpression(new CodeThisReferenceExpression(), "ChangeSet");
  122. CodeMethodReferenceExpression expression2 = new CodeMethodReferenceExpression(targetObject, "GetOriginal");
  123. CodeMethodInvokeExpression expression3 = new CodeMethodInvokeExpression(expression2, new CodeExpression[] { new CodeArgumentReferenceExpression(name) });
  124. CodeExpression expression4 = new CodePropertyReferenceExpression(new CodeThisReferenceExpression(), "DbContext");
  125. CodePropertyReferenceExpression expression5 = new CodePropertyReferenceExpression(expression4, entity2.DefaultObjectSetName);
  126. CodeMethodInvokeExpression expression = new CodeMethodInvokeExpression(expression5, "AttachAsModified", new CodeExpression[] { new CodeArgumentReferenceExpression(name), expression3, new CodePropertyReferenceExpression(new CodeThisReferenceExpression(), "DbContext") });
  127. CodeExpressionStatement statement = new CodeExpressionStatement(expression);
  128. method.Statements.Add(statement);
  129. }
  130. else
  131. {
  132. CodeExpression expression7 = new CodePropertyReferenceExpression(new CodeThisReferenceExpression(), "DbContext");
  133. CodePropertyReferenceExpression expression8 = new CodePropertyReferenceExpression(expression7, entity2.DefaultObjectSetName);
  134. CodeMethodInvokeExpression expression9 = new CodeMethodInvokeExpression(expression8, "AttachAsModified", new CodeExpression[] { new CodeArgumentReferenceExpression(name), new CodePropertyReferenceExpression(new CodeThisReferenceExpression(), "DbContext") });
  135. CodeExpressionStatement statement2 = new CodeExpressionStatement(expression9);
  136. method.Statements.Add(statement2);
  137. }
  138. }
  139. private static CodeExpression GetContextReferenceExpression()
  140. {
  141. return new CodePropertyReferenceExpression(new CodeThisReferenceExpression(), "DbContext");
  142. }
  143. private static CodeExpression GetDbSetReferenceExpression(LinqToEntitiesEntity efDbEntity)
  144. {
  145. return new CodePropertyReferenceExpression(GetContextReferenceExpression(), efDbEntity.DefaultObjectSetName);
  146. }
  147. private void InitMetadataWorkspace()
  148. {
  149. if (!this._isCodeFirstModel.HasValue)
  150. {
  151. this._isCodeFirstModel = new bool?(!this.TryInitMetadataWorkspaceFromResources());
  152. }
  153. if (this._isCodeFirstModel.Value)
  154. {
  155. DbContextUtilities.SetDbInitializer(base.ContextType, DbContextUtilities.DbContextTypeReference, null);
  156. if (base.ContextType.GetConstructor(Type.EmptyTypes) == null)
  157. {
  158. throw new InvalidOperationException(string.Format(CultureInfo.CurrentCulture, Resources.LinqToEntitiesDbContext_DefaultCtorNotFound, new object[] { base.ContextType.FullName }));
  159. }
  160. try
  161. {
  162. object obj2 = Activator.CreateInstance(base.ContextType);
  163. if (obj2 != null)
  164. {
  165. Type type2 = DbContextUtilities.LoadTypeFromAssembly(DbContextUtilities.GetDbContextTypeReference(base.ContextType).Assembly, "System.Data.Entity.Infrastructure.IObjectContextAdapter");
  166. if (type2 != null)
  167. {
  168. PropertyInfo property = type2.GetProperty("ObjectContext");
  169. if (property != null)
  170. {
  171. ObjectContext context = property.GetValue(obj2, null) as ObjectContext;
  172. if (context != null)
  173. {
  174. this._metadataWorkspace = context.MetadataWorkspace;
  175. }
  176. }
  177. }
  178. }
  179. }
  180. catch (TargetInvocationException exception)
  181. {
  182. throw new InvalidOperationException(string.Format(CultureInfo.CurrentCulture, Resources.LinqToEntitiesDbContext_UnableToCreateContext, new object[0]), (exception == null) ? null : exception.InnerException);
  183. }
  184. catch (Exception exception2)
  185. {
  186. if (exception2.IsFatal())
  187. {
  188. throw;
  189. }
  190. throw new InvalidOperationException(string.Format(CultureInfo.CurrentCulture, Resources.LinqToEntitiesDbContext_UnableToCreateContext, new object[0]), exception2);
  191. }
  192. }
  193. this._metadataWorkspace.LoadFromAssembly(base.ContextType.Assembly);
  194. }
  195. private bool TryInitMetadataWorkspaceFromResources()
  196. {
  197. this._metadataWorkspace = System.Data.Mapping.MetadataWorkspaceUtilities.CreateMetadataWorkspaceFromResources(base.ContextType, DbContextUtilities.DbContextTypeReference);
  198. return (this._metadataWorkspace != null);
  199. }
  200. public override System.Data.Metadata.Edm.MetadataWorkspace MetadataWorkspace
  201. {
  202. get
  203. {
  204. if (this._metadataWorkspace == null)
  205. {
  206. this.InitMetadataWorkspace();
  207. }
  208. return this._metadataWorkspace;
  209. }
  210. }
  211. internal override bool NeedToGenerateMetadataClasses
  212. {
  213. get
  214. {
  215. if (!this._isCodeFirstModel.HasValue)
  216. {
  217. this._isCodeFirstModel = new bool?(!this.TryInitMetadataWorkspaceFromResources());
  218. }
  219. return !this._isCodeFirstModel.Value;
  220. }
  221. }
  222. }
  223. }