Пример #1
0
        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);
        }
Пример #2
0
 public DbContextEntitiesResult GetAll(HttpContext httpContext, string contextName, DbContextEntityInfo entityInfo)
 {
     return(GetAll(httpContext, contextName, entityInfo, new Dictionary <string, string>(), null));
 }
Пример #3
0
        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);
        }
Пример #4
0
        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);
        }
Пример #5
0
        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()"));
            }
        }