private Expression BuildMasterDetailRelationExpression(ref bool isManyToMany, ref Expression memberChain, Type masterType, Type detailType, IEnumerable <Type> routeEntityTypes, int currentEntityIndex) { var masterIdProperty = detailType.GetPropertyIgnoreCase(masterType.Name + "id"); if (masterIdProperty != null) { var relation = Expression.Equal( Expression.Property(memberChain, masterIdProperty), Expression.Constant(Convert.ChangeType(_actionContextAccessor.GetRouteParamIgnoreCase(masterIdProperty.Name), masterIdProperty.PropertyType))); var masterObjectProperty = detailType.GetProperty(masterType.Name); if (masterObjectProperty == null) { throw new InvalidOperationException($"Type '{detailType.Name}' does not contain a '{masterType.Name}' property."); } AppendMemberChain(ref memberChain, masterObjectProperty); return(relation); } isManyToMany = true; return(BuildMasterDetailManyToManyRelationExpression(memberChain, masterType, detailType, routeEntityTypes, currentEntityIndex)); }
private async Task <RecordError> ValidateParentEntitiesExistenceAsync() { for (int i = 0; i <= _routeEntityTypes.Count() - 2; i++) { var entityType = _routeEntityTypes.ElementAt(i); var id = Convert.ChangeType(_actionContextAccessor.GetRouteParamIgnoreCase(entityType.Name + "id"), entityType.BaseGenericType().GenericTypeArguments[0]); var result = await ValidateEntityExistenceAsync(entityType, id); if (result != null) { return(result); } } return(await Task.FromResult <RecordError>(null)); }
public void FillForeignKeysFromRoute <TEntity>(TEntity entity) { foreach (var property in _propertyProvider.GetProperties(entity.GetType()) .Where(p => _actionContextAccessor.HasRouteParamIgnoreCase(p.Name))) { entity.SetPropertyValue(property.Name, Convert.ChangeType(_actionContextAccessor.GetRouteParamIgnoreCase(property.Name), property.PropertyType)); } }