public Expression BuildPermissionEntityExpression(object context, ISet <EntityMutationInfo> cache, Expression memberExpression = null) { cache.Add(this); var isCreation = State == EntityState.Added; var entityParameterExpression = isCreation ? null : memberExpression ?? Expression.Parameter(EntityType.ClrType); var selfPermissionBindingExpression = isCreation ? null : BuildSelfPermissionBinding(entityParameterExpression, context); var permissionPropertiesMemberBindingExpressions = Properties.Values.Where(memberMutationInfo => memberMutationInfo.IsModified).Select(property => property.BuildMemberBindingExpression(entityParameterExpression, cache)).ToArray(); var scalarNavigationPropertiesMemberBindingExpressions = References.Values.Where(memberMutationInfo => memberMutationInfo.IsModified).Select(reference => reference.BuildMemberBindingExpression(entityParameterExpression, cache)).ToArray(); var collectionNavigationPropertiesMemberBindingExpressions = Collections.Values.Where(memberMutationInfo => memberMutationInfo.IsModified).Select(collection => collection.BuildMemberBindingExpression(entityParameterExpression, cache)).ToArray(); var memberBindingExpressions = permissionPropertiesMemberBindingExpressions.Union(scalarNavigationPropertiesMemberBindingExpressions).Union(collectionNavigationPropertiesMemberBindingExpressions); if (selfPermissionBindingExpression != null) { memberBindingExpressions = memberBindingExpressions.Append(selfPermissionBindingExpression).ToArray(); } memberBindingExpressions = memberBindingExpressions.Where(memberBinding => memberBinding != null); if (memberBindingExpressions.Any()) { if (entityParameterExpression != null) { var primaryKeyBindingExpression = PrimaryKey.Properties.Select(primaryKeyProperty => Expression.Bind(PermissionType.GetProperty(primaryKeyProperty.Name), Expression.MakeMemberAccess(entityParameterExpression, primaryKeyProperty.PropertyInfo))); memberBindingExpressions = primaryKeyBindingExpression.Union(memberBindingExpressions); } var permissionEntityType = MutationContext.PermissionEntityTypeBuilder.TypeMap[EntityType]; var newPermissionExpression = BuildNewPermissionMemberInitExpression(permissionEntityType, memberBindingExpressions.ToArray()); if (memberExpression == null) { var findEntityExpression = State == EntityState.Added ? null : BuildFindEntityQuery(); var permissionExpression = findEntityExpression == null ? newPermissionExpression : BuildSelectFirstOrDefaultPermissionEntityExpression(findEntityExpression, (ParameterExpression)entityParameterExpression, newPermissionExpression); return(permissionExpression); } else { return(newPermissionExpression); } } return(null); }