Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/316.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 十进制精度和比例:实体框架代码优先_C#_Entity Framework - Fatal编程技术网

C# 十进制精度和比例:实体框架代码优先

C# 十进制精度和比例:实体框架代码优先,c#,entity-framework,C#,Entity Framework,我想在“代码优先”方法中为所有十进制字段设置精度 正在为此创建自定义属性: [AttributeUsage(AttributeTargets.Property, Inherited = false, AllowMultiple = false)] public sealed class DecimalPrecisionAttribute : Attribute { public DecimalPrecisionAttribute(byte precisio

我想在“代码优先”方法中为所有十进制字段设置精度

正在为此创建自定义属性:

    [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)]
公共可为空的DeliveryPrice{get;set;}
模型创建时受保护的覆盖无效(DbModelBuilder modelBuilder)
{
foreach(在Assembly.GetAssembly(typeof(DecimalPrecisionAttribute)).GetTypes()中从t输入classType
其中t.IsClass&&t.Namespace==“YOURMODELNAMESPACE”
选择t)
{
foreach(classType.GetProperties(BindingFlags.Public | BindingFlags.Instance)中的var propAttr)。其中(p=>p.GetCustomAttribute()!=null)。选择(
p=>new{prop=p,attr=p.GetCustomAttribute(true)})
{
var entityConfig=modelBuilder.GetType().GetMethod(“实体”).MakeGenericMethod(classType).Invoke(modelBuilder,null);
ParameterExpression param=ParameterExpression.Parameter(类类型,“c”);
Expression property=Expression.property(参数,propAttr.prop.Name);
LambdaExpression LambdaExpression=Expression.Lambda(属性,true,
新参数表达式[]
{param});
小数属性配置小数配置;
if(propAttr.prop.PropertyType.IsGenericType&&propAttr.prop.PropertyType.GetGenericTypeDefinition()==typeof(可为空))
{
MethodInfo MethodInfo=entityConfig.GetType().GetMethods().Where(p=>p.Name==“Property”).ToList()[7];
decimalConfig=methodInfo.Invoke(entityConfig,new[]{lambdaExpression})作为DecimalPropertyConfiguration;
}
其他的
{
MethodInfo MethodInfo=entityConfig.GetType().GetMethods().Where(p=>p.Name==“Property”).ToList()[6];
decimalConfig=methodInfo.Invoke(entityConfig,new[]{lambdaExpression})作为DecimalPropertyConfiguration;
}
decimalConfig.HasPrecision(propAttr.attr.Precision,propAttr.attr.Scale);
}
}
}
但是会检测到一个错误

错误1“System.Reflection.PropertyInfo”不包含“GetCustomAttribute”的定义,并且找不到接受“System.Reflection.PropertyInfo”类型的第一个参数的扩展方法“GetCustomAttribute”(是否缺少using指令或程序集引用?)


如何解决此问题?

您是为.NET 4.5编译的吗?因为扩展方法
GetCustomAttribute(bool)
仅存在于该版本中。对于我来说,这真是一个谜,你如何编写详细的反射代码,但却无法找出你正在使用的.NET版本。
    [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);
            }
        }
    }