public DbContextEntityResult GetEntityByPrimaryKey(HttpContext httpContext, string contextName, DbContextEntityInfo entityInfo, Dictionary <string, string> pkValues) { Type dbContextType = GetDbContextTypes().FirstOrDefault(y => y.Name == contextName); DbContext dbContext = httpContext?.RequestServices?.GetService(dbContextType) as DbContext; if (dbContext == null) { return(DbContextEntityResult.Error("Cannot find DbContext: " + contextName)); } try { var primaryKeys = entityInfo.Fields .Where(x => x.IsPrimaryKey) .Select(x => Binder.ConvertToType(pkValues.FirstOrDefault(v => v.Key == x.Name).Value, x.FieldInfo.FieldType)) .ToArray(); var entity = dbContext.Find(entityInfo.ClrType, primaryKeys); if (entity == null) { var pkString = string.Join(";", pkValues.Select(x => x.Key + "=" + x.Value).ToArray()); return(DbContextEntityResult.Error($"Cannot find entity {entityInfo.ClrTypeName} with primary key: {pkString}")); } var entityEntry = dbContext.Entry(entity); var fieldsValues = entityInfo.Fields.ToDictionary( x => x.Name, x => entityEntry.Property(x.Name).CurrentValue); return(new DbContextEntityResult { Entity = entity, FieldsValues = fieldsValues }); } catch (Exception ex) { var pkString = string.Join(";", pkValues.Select(x => x.Key + "=" + x.Value).ToArray()); return(DbContextEntityResult.Error($"Cannot find entity {entityInfo.ClrTypeName} with primary key: {pkString}. ex.GetDetails()")); } }
public DbContextEntitiesResult GetAll(HttpContext httpContext, string contextName, DbContextEntityInfo entityInfo, Dictionary <string, string> where, int?page) { DbContextEntitiesResult results = new DbContextEntitiesResult(); results.Fields = entityInfo.Fields; try { Type dbContextType = GetDbContextTypes().FirstOrDefault(y => y.Name == contextName); DbContext dbContext = httpContext?.RequestServices?.GetService(dbContextType) as DbContext; if (dbContext == null) { return(DbContextEntitiesResult.Error("Cannot find DbContext: " + contextName)); } object dbSet = Reflector.InvokeGenericMethod(dbContext, "Set", new[] { entityInfo.ClrType }); ParameterExpression x = Expression.Parameter(entityInfo.ClrType, "x"); BinaryExpression lastOperation = null; foreach (var whereCondition in where) { var fieldInfo = entityInfo.Fields.FirstOrDefault(f => f.Name == whereCondition.Key); var operation = Expression.Equal( Expression.Call(typeof(EF), nameof(EF.Property), new[] { fieldInfo.ClrType }, x, Expression.Constant(whereCondition.Key)), Expression.Constant(Binder.ConvertToType(whereCondition.Value, fieldInfo.ClrType), fieldInfo.ClrType)); if (lastOperation == null) { lastOperation = operation; } else { lastOperation = Expression.And(lastOperation, operation); } } if (lastOperation != null) { Type delegateType = typeof(Func <,>).MakeGenericType(entityInfo.ClrType, typeof(bool)); LambdaExpression predicate = Expression.Lambda(delegateType, lastOperation, x); var whereMethod = typeof(System.Linq.Queryable).GetMethods(BindingFlags.Static | BindingFlags.Public) .FirstOrDefault(m => m.Name == "Where" && m.GetParameters().Count() == 2); MethodInfo genericWhereMethod = whereMethod.MakeGenericMethod(new[] { entityInfo.ClrType }); dbSet = genericWhereMethod.Invoke(null, new object[] { dbSet, predicate }); } int take = 200; int skip = (page.GetValueOrDefault(1) - 1) * 200; var skipMethod = typeof(System.Linq.Enumerable).GetMethods(BindingFlags.Static | BindingFlags.Public) .FirstOrDefault(m => m.Name == "Skip" && m.GetParameters().Count() == 2); MethodInfo genericSkipMethod = skipMethod.MakeGenericMethod(new[] { entityInfo.ClrType }); dbSet = genericSkipMethod.Invoke(null, new object[] { dbSet, skip }); //dbSet = typeof(System.Linq.Enumerable).InvokeStaticGenericMethod("Skip", new[] { entityInfo.ClrType }, dbSet, take); var takeMethod = typeof(System.Linq.Enumerable).GetMethods(BindingFlags.Static | BindingFlags.Public) .FirstOrDefault(m => m.Name == "Take" && m.GetParameters().Count() == 2); MethodInfo genericTakeMethod = takeMethod.MakeGenericMethod(new[] { entityInfo.ClrType }); dbSet = genericTakeMethod.Invoke(null, new object[] { dbSet, take }); //dbSet = typeof(System.Linq.Enumerable).InvokeStaticGenericMethod("Take", new[] { entityInfo.ClrType }, dbSet, take); var toListMethod = typeof(System.Linq.Enumerable).GetMethods(BindingFlags.Static | BindingFlags.Public) .FirstOrDefault(m => m.Name == "ToList" && m.GetParameters().Count() == 1); MethodInfo genericToListMethod = toListMethod.MakeGenericMethod(new[] { entityInfo.ClrType }); dbSet = genericToListMethod.Invoke(null, new object[] { dbSet }); foreach (var entity in dbSet as System.Collections.IEnumerable) { var entityEntry = dbContext.Entry(entity); object[] row = new object[entityInfo.Fields.Count]; for (int i = 0; i < entityInfo.Fields.Count; i++) { row[i] = entityEntry.Property(entityInfo.Fields[i].Name).CurrentValue; } results.Rows.Add(row); } return(results); } catch (Exception ex) { results.Errors.Add(ex.GetAllMessages()); } return(results); }
public DbContextEntityResult Update(HttpContext httpContext, string contextName, DbContextEntityInfo entityInfo, Dictionary <string, string> pkValues, Dictionary <string, string> fieldsValues) { Type dbContextType = GetDbContextTypes().FirstOrDefault(y => y.Name == contextName); DbContext dbContext = httpContext?.RequestServices?.GetService(dbContextType) as DbContext; if (dbContext == null) { return(DbContextEntityResult.Error("Cannot find DbContext: " + contextName)); } var entityResult = GetEntityByPrimaryKey(httpContext, contextName, entityInfo, pkValues); if (entityResult.IsSuccess == false) { return(DbContextEntityResult.Error(entityResult.Errors)); } object entity = entityResult.Entity; DbContextEntityResult result = new DbContextEntityResult(); result.Entity = entity; var entityEntry = dbContext.Entry(entity); foreach (var field in entityInfo.Fields) { object value = fieldsValues.FirstOrDefault(x => x.Key == field.Name).Value; try { if (Binder.IsConvertionSupported(field.ClrType) == false) { result.Warnings.Add($"Type of property {field.Name} is not supported."); continue; } value = Binder.ConvertToType(value, field.ClrType); entityEntry.Property(field.Name).CurrentValue = value; } catch (Exception ex) { result.Errors.Add($"Cannot set entity property {field.Name} to {value}. Error: {ex.GetAllMessages()}"); } } if (result.Errors.Count > 0) { return(result); } try { dbContext.Update(entity); } catch (Exception ex) { result.Errors.Add($"Cannot update entity in the context. Error: {ex.GetAllMessages()}"); return(result); } try { dbContext.SaveChanges(); } catch (Exception ex) { result.Errors.Add($"Cannot save entity. Error: {ex.GetAllMessages()}"); return(result); } return(result); }
public DbContextEntityResult Add(HttpContext httpContext, string contextName, DbContextEntityInfo entityInfo, Dictionary <string, string> fieldsValues) { Type dbContextType = GetDbContextTypes().FirstOrDefault(y => y.Name == contextName); DbContext dbContext = httpContext?.RequestServices?.GetService(dbContextType) as DbContext; if (dbContext == null) { return(DbContextEntityResult.Error("Cannot find DbContext: " + contextName)); } var entity = Activator.CreateInstance(entityInfo.ClrType); DbContextEntityResult result = new DbContextEntityResult(); result.Entity = entity; var entityEntry = dbContext.Entry(entity); foreach (var field in fieldsValues) { try { var entityField = entityInfo.Fields.FirstOrDefault(x => x.Name == field.Key); if (entityField == null) { result.Errors.Add($"Property {field.Key} does not exist in the entity {entityInfo.ClrTypeName}"); continue; } var value = Binder.ConvertToType(field.Value, entityField.ClrType); entityEntry.Property(field.Key).CurrentValue = value; }catch (Exception ex) { result.Errors.Add($"Cannot set entity property {field.Key} to {field.Value}. Error: {ex.GetAllMessages()}"); } } if (result.Errors.Count > 0) { return(result); } try { dbContext.Add(entity); } catch (Exception ex) { result.Errors.Add($"Cannot add entity to the context. Error: {ex.GetAllMessages()}"); return(result); } try { dbContext.SaveChanges(); } catch (Exception ex) { result.Errors.Add($"Cannot save entity. Error: {ex.GetAllMessages()}"); return(result); } return(result); }
public ServiceInvokeResult InvokeMethod(ServiceInfo service, ServiceMethodInfo method, Dictionary <string, string> paramters) { List <(ParameterInfo Field, string Value)> methodParameters = method.Method.GetParameters().Select(x => (x, paramters.FirstOrDefault(v => v.Key == x.Name).Value)).ToList(); List <string> errors = new List <string>(); List <object> invokeValues = new List <object>(); object serviceInstance = null; try { serviceInstance = new HttpContextHelper().HttpContext.RequestServices.GetService(service.ServiceType); } catch (Exception ex) { errors.Add($"Cannot instantiate the service. Error: {ex.GetAllMessages()}"); return(new ServiceInvokeResult { Errors = errors }); } foreach (var param in methodParameters) { try { invokeValues.Add(Binder.ConvertToType(param.Value, param.Field.ParameterType)); } catch (Exception ex) { errors.Add($"Cannot set entity property {param.Field.Name} to {param.Value}. Error: {ex.GetAllMessages()}"); } } if (errors.Count > 0) { return new ServiceInvokeResult { Errors = errors } } ; object result = null; try { result = method.Method.Invoke(serviceInstance, invokeValues.ToArray()); if (result is Task) { ((Task)result).Wait(); } } catch (Exception ex) { errors.Add($"Method invocation resulted with the error: {ex.GetAllDetails()}"); return(new ServiceInvokeResult { Errors = errors }); } try { if (result == null) { return new ServiceInvokeResult { Result = "null" } } ; return(new ServiceInvokeResult { Result = result.ToJson() }); } catch (Exception ex) { return(new ServiceInvokeResult { Result = ex.GetAllDetails() } ); } }