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