Entity Framework Code First fluent API setting field properties in a for loop

前端 未结 2 1447
隐瞒了意图╮
隐瞒了意图╮ 2021-01-24 12:07

I am using Entity Framework Code First to create a database table. My model class has ten decimal fields. Currently I am setting the field property like this in the OnMode

相关标签:
2条回答
  • 2021-01-24 12:30

    This should work for you - using reflection to get all the properties of type decimal in your entity, then building an expression tree for the property access and finally using the property access lambda to set the precision to the desired values.

    protected override void OnModelCreating(DbModelBuilder modelBuilder)
    {
        var properties = typeof(Envelopes).GetProperties()
                                          .Where(p => p.PropertyType == typeof(decimal));
    
        foreach (var property in properties)
        {
            var lambda = BuildLambda<Envelopes, decimal>(property);
            modelBuilder.Entity<Envelopes>()
                        .Property(lambda)
                        .HasPrecision(18, 2);
        }
    }
    
    static Expression<Func<T, U>> BuildLambda<T,U>(PropertyInfo property)
    {
        var param = Expression.Parameter(typeof(T), "p");
        MemberExpression memberExpression = Expression.Property(param, property);
        var lambda = Expression.Lambda<Func<T, U>>(memberExpression, param);
        return lambda;
    }
    
    0 讨论(0)
  • 2021-01-24 12:30

    model creation with some reflection

    var entityTypes = Assembly.GetExecutingAssembly().GetTypes().Where(t => t.IsClass && t.Namespace == "Namespace.Enitites");
    foreach (var type in entityTypes)
    {
        foreach (var property in type.GetProperties().Where(p => p.PropertyType == typeof(decimal)))
        {
            var entityConfig = modelBuilder.GetType().GetMethod("Entity").MakeGenericMethod(type).Invoke(modelBuilder, null);
            var param = Expression.Parameter(type, "c");
            var lambdaExpression = Expression.Lambda(Expression.Property(param, property), true, new[] { param });
    
            var items = entityConfig.GetType().GetMethods().Where(p => p.Name == "Property" && p.ReturnType == typeof(DecimalPropertyConfiguration)).ToArray();
            if (items.Length <= 0)
                continue;
    
            MethodInfo methodInfo;
            if (property.PropertyType.IsGenericType && property.PropertyType.GetGenericTypeDefinition() == typeof(Nullable<>))
                methodInfo = items[1];
            else
                methodInfo = items[0];
    
            var decimalConfig = methodInfo.Invoke(entityConfig, new[] { lambdaExpression }) as DecimalPropertyConfiguration;
            if (decimalConfig != null)
                decimalConfig.HasPrecision(19, 4);
        }
    }
    

    or

    modelBuilder.Conventions.Remove<DecimalPropertyConvention>();
    modelBuilder.Conventions.Add(new DecimalPropertyConvention(19, 4));
    
    0 讨论(0)
提交回复
热议问题