小数精度和比例:实体框架代码优先

时间:2013-04-23 06:05:11

标签: c# entity-framework

我想在代码第一种方法中为所有十进制字段设置精度。为此

为此创建自定义属性:

    [AttributeUsage(AttributeTargets.Property, Inherited = false, AllowMultiple = false)]
    public sealed class DecimalPrecisionAttribute : Attribute
    {
        public DecimalPrecisionAttribute(byte precision, byte scale)
        {
            Precision = precision;
            Scale = scale;

        }

        public byte Precision { get; set; }
        public byte Scale { get; set; }

    }
使用

    [DecimalPrecision(20,10)]
    public Nullable<decimal> DeliveryPrice { get; set; }

    protected override void OnModelCreating(DbModelBuilder modelBuilder)
    {
        foreach (Type classType in from t in Assembly.GetAssembly(typeof(DecimalPrecisionAttribute)).GetTypes()
                                       where t.IsClass && t.Namespace == "YOURMODELNAMESPACE"
                                       select t)
         {
             foreach (var propAttr in classType.GetProperties(BindingFlags.Public | BindingFlags.Instance).Where(p => p.GetCustomAttribute<DecimalPrecisionAttribute>() != null).Select(
                    p => new { prop = p, attr = p.GetCustomAttribute<DecimalPrecisionAttribute>(true) }))
             {

                 var entityConfig = modelBuilder.GetType().GetMethod("Entity").MakeGenericMethod(classType).Invoke(modelBuilder, null);
                 ParameterExpression param = ParameterExpression.Parameter(classType, "c");
                 Expression property = Expression.Property(param, propAttr.prop.Name);
                 LambdaExpression lambdaExpression = Expression.Lambda(property, true,
                                                                          new ParameterExpression[]
                                                                              {param});
                 DecimalPropertyConfiguration decimalConfig;
                 if (propAttr.prop.PropertyType.IsGenericType && propAttr.prop.PropertyType.GetGenericTypeDefinition() == typeof(Nullable<>))
                 {
                     MethodInfo methodInfo = entityConfig.GetType().GetMethods().Where(p => p.Name == "Property").ToList()[7];
                     decimalConfig = methodInfo.Invoke(entityConfig, new[] { lambdaExpression }) as DecimalPropertyConfiguration;
                 }
                 else
                 {
                     MethodInfo methodInfo = entityConfig.GetType().GetMethods().Where(p => p.Name == "Property").ToList()[6];
                     decimalConfig = methodInfo.Invoke(entityConfig, new[] { lambdaExpression }) as DecimalPropertyConfiguration;
                 }

                 decimalConfig.HasPrecision(propAttr.attr.Precision, propAttr.attr.Scale);
            }
        }
    }

但是会检测到错误,

  

错误1'System.Reflection.PropertyInfo'不包含'GetCustomAttribute'的定义,并且没有扩展方法'GetCustomAttribute'接受类型'System.Reflection.PropertyInfo'的第一个参数可以找到(你错过了使用吗?指令或程序集引用?)。

我该如何解决这个问题?

0 个答案:

没有答案