实体框架 以编程方式设置模型中的所有小数精度值

本文关键字:小数 精度 模型 框架 编程 方式 设置 实体 | 更新日期: 2023-09-27 18:34:51

这个问题的答案(下面的链接(让我想知道我的问题是否可行?

实体框架代码 第一个流畅的 API 在 for 循环中设置字段属性

有没有办法更动态地做到这一点?我想使用多个模型执行此操作,并且不想在onmodelcreate中为我要配置的每个实体类克隆代码。可能是空基类?

实体框架 以编程方式设置模型中的所有小数精度值

在 EF6 中,您将使用自定义约定执行此操作。应该不超过几行代码。

在 EF5 中,您可能必须使用反射发现实体类型,然后按照上面提供的链接中所述对其进行配置。这是我想出的代码(我从上面链接的帖子中窃取了构建用于访问属性的表达式的方法(:

protected override void OnModelCreating(DbModelBuilder modelBuilder)
{
    foreach (var contextProperty in typeof(Context).GetProperties())
    {
        if (contextProperty.PropertyType.IsGenericType && 
            contextProperty.PropertyType.GetGenericTypeDefinition() == typeof(DbSet<>))
        {
            var entityType = contextProperty.PropertyType.GenericTypeArguments[0];
            foreach(var decimalProperty in entityType.GetProperties().Where(p => p.PropertyType == typeof(decimal)))
            {    
                var configurePropertyMethod = 
                    GetType()
                    .GetMethod("ConfigureProperty", BindingFlags.Static | BindingFlags.NonPublic)
                    .MakeGenericMethod(entityType);
                configurePropertyMethod.Invoke(null, new object[] { modelBuilder, decimalProperty });
            }
        }
    }
}
private static void ConfigureProperty<T>(DbModelBuilder modelBuilder, PropertyInfo propertyInfo) 
    where T : class
{
    var propertyExpression = BuildLambda<T, decimal>(propertyInfo);
    modelBuilder.Entity<T>().Property(propertyExpression).HasPrecision(10, 3);
}
private 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;
}