Entity Framework Code Первый свободный API, устанавливающий свойства поля в цикле for
Я использую 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 ответа
Это должно работать для вас - используя отражение, чтобы получить все свойства типа 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;
}
Создание модели с некоторым отражением
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));