Entity Framework Code Первый свободный API, устанавливающий свойства поля в цикле for - PullRequest
1 голос
/ 09 апреля 2011

Я использую Entity Framework Code First для создания таблицы базы данных. У моего модельного класса есть десять десятичных полей. В настоящее время я устанавливаю свойство поля следующим образом в методе OnModelCreating:

modelBuilder.Entity<Envelopes>().Property(p => p.cell_1_1).HasPrecision(18, 2);

Поскольку у меня есть десять полей, я думаю об использовании цикла for для установки этого свойства точности, такого как следующий код:

for( int i = 1; i <= 10; i++ ) {
    modelBuilder.Entity<Envelopes>()
                .Property(p => p.Equals("cell_1_"+i ))
                .HasPrecision(18, 2);
}

Однако приведенный выше код вызывает синтаксическую ошибку.

Можно ли установить значение точности следующим образом?

Ответы [ 2 ]

4 голосов
/ 09 апреля 2011

Это должно сработать для вас - используйте отражение, чтобы получить все свойства типа decimal в вашей сущности, затем построите дерево выражений для доступа к свойству и, наконец, используйте лямбду доступа к свойству, чтобы установить точность для желаемых значений.

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 голосов
/ 11 июня 2015

создание модели с некоторым отражением

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);
    }
}

или

modelBuilder.Conventions.Remove<DecimalPropertyConvention>();
modelBuilder.Conventions.Add(new DecimalPropertyConvention(19, 4));
...