/// <summary> /// Generates the select domain operation entry /// </summary> /// <param name="codeGenContext">The code generation context.</param> /// <param name="businessLogicClass">Contains the business logic.</param> /// <param name="entity">The entity.</param> /// <returns>The newly created method.</returns> protected override CodeMemberMethod GenerateSelectMethod(ICodeGenContext codeGenContext, CodeTypeDeclaration businessLogicClass, IBusinessLogicEntity entity) { CodeMemberMethod method = null; LinqToEntitiesEntity efDbEntity = entity as LinqToEntitiesEntity; if (efDbEntity != null && efDbEntity.DefaultObjectSetName != null) { // public IQueryable<$entityType$> GetEntities() method = new CodeMemberMethod(); businessLogicClass.Members.Add(method); // Add developer comment explaining they can add additional parameters method.Comments.Add(new CodeCommentStatement(Resources.BusinessLogicClass_Query_Method_Remarks, false)); // And for EF, we add an additional comment warning they need to add ordering if they want paging string queryComment = String.Format(CultureInfo.CurrentCulture, Resources.BusinessLogicClass_Query_Method_EF_Remarks, efDbEntity.DefaultObjectSetName); method.Comments.Add(new CodeCommentStatement(queryComment, false)); method.Name = "Get" + CodeGenUtilities.MakeLegalEntityName(efDbEntity.DefaultObjectSetName); method.ReturnType = new CodeTypeReference("IQueryable", new CodeTypeReference(entity.Name)); method.Attributes = MemberAttributes.Public | MemberAttributes.Final; // final needed to prevent virtual // return this.DbContext.$TablePropertyName$ CodeExpression contextExpr = LinqToEntitiesDbContext.GetContextReferenceExpression(); CodeExpression expr = new CodePropertyReferenceExpression(contextExpr, efDbEntity.DefaultObjectSetName); CodeMethodReturnStatement returnStmt = new CodeMethodReturnStatement(expr); method.Statements.Add(returnStmt); } return(method); }
/// <summary> /// Returns the expression for this.DbContext.$TablePropertyName$. /// </summary> /// <param name="efDbEntity">The entity in for which the DbSet is needed.</param> /// <returns>The this.DbContext.$TablePropertyName$ expression.</returns> private static CodeExpression GetDbSetReferenceExpression(LinqToEntitiesEntity efDbEntity) { CodeExpression contextExpr = LinqToEntitiesDbContext.GetContextReferenceExpression(); CodeExpression expr = new CodePropertyReferenceExpression(contextExpr, efDbEntity.DefaultObjectSetName); return(expr); }
/// <summary> /// Generates the delete domain operation entry /// </summary> /// <param name="codeGenContext">The context to use</param> /// <param name="businessLogicClass">The business logic class into which to generate it</param> /// <param name="entity">The entity for which to generate the method</param> protected override void GenerateDeleteMethod(ICodeGenContext codeGenContext, CodeTypeDeclaration businessLogicClass, IBusinessLogicEntity entity) { string parameterName = CodeGenUtilities.MakeLegalParameterName(entity.Name); // public void Delete$EntityName$($entityType$ $entityName$) CodeMemberMethod method = new CodeMemberMethod(); businessLogicClass.Members.Add(method); LinqToEntitiesEntity efDbEntity = (LinqToEntitiesEntity)entity; method.Name = "Delete" + CodeGenUtilities.MakeLegalEntityName(entity.Name); method.Attributes = MemberAttributes.Public | MemberAttributes.Final; // final needed to prevent virtual // parameter declaration method.Parameters.Add(new CodeParameterDeclarationExpression(entity.ClrType.Name, parameterName)); // Below we're generating the following method body // DbEntityEntry<$entityType$> entityEntry = this.DbContext.Entry($entity$); // if (entityEntry.State != EntityState.Detached) // { // entityEntry.State = EntityState.Deleted; // } // else // { // this.DbContext.$TablePropertyName$.Attach($entity$); // this.DbContext.$TablePropertyName$.Remove($entity$); // } CodeArgumentReferenceExpression entityArgRef = new CodeArgumentReferenceExpression(parameterName); CodeExpression contextRef = LinqToEntitiesDbContext.GetContextReferenceExpression(); CodeVariableDeclarationStatement entityEntryDeclaration = new CodeVariableDeclarationStatement( new CodeTypeReference("DbEntityEntry", new CodeTypeReference(entity.ClrType.Name)), "entityEntry", new CodeMethodInvokeExpression(new CodeMethodReferenceExpression(contextRef, "Entry"), entityArgRef)); method.Statements.Add(entityEntryDeclaration); CodeVariableReferenceExpression entityEntryRef = new CodeVariableReferenceExpression("entityEntry"); CodePropertyReferenceExpression entityStateRef = new CodePropertyReferenceExpression(entityEntryRef, "State"); CodeFieldReferenceExpression detachedStateRef = new CodeFieldReferenceExpression(new CodeTypeReferenceExpression(typeof(EntityState).Name), Enum.GetName(typeof(EntityState), EntityState.Deleted)); CodeExpression detachedStateTestExpr = CodeGenUtilities.MakeNotEqual(typeof(EntityState), entityStateRef, detachedStateRef, codeGenContext.IsCSharp); CodeFieldReferenceExpression deletedStateRef = new CodeFieldReferenceExpression(new CodeTypeReferenceExpression(typeof(EntityState).Name), Enum.GetName(typeof(EntityState), EntityState.Deleted)); CodeAssignStatement deletedStateExpr = new CodeAssignStatement(entityStateRef, deletedStateRef); CodeMethodInvokeExpression attachedEntityMethodCall = new CodeMethodInvokeExpression(LinqToEntitiesDbContext.GetDbSetReferenceExpression(efDbEntity), "Attach", entityArgRef); CodeMethodInvokeExpression removedEntityMethodCall = new CodeMethodInvokeExpression(LinqToEntitiesDbContext.GetDbSetReferenceExpression(efDbEntity), "Remove", entityArgRef); CodeConditionStatement changeStateOrAddStmt = new CodeConditionStatement(detachedStateTestExpr, new CodeStatement[] { deletedStateExpr }, new CodeStatement[] { new CodeExpressionStatement(attachedEntityMethodCall), new CodeExpressionStatement(removedEntityMethodCall) }); method.Statements.Add(changeStateOrAddStmt); }