这个问题的答案(下面的链接)让我想知道我的问题是否可能?
Entity Framework Code First fluent API在for循环中设置字段属性
有没有办法更动态地做到这一点?我有多个模型想要执行此操作,并且不想为我要配置的每个实体类克隆 onmodelcreating 中的代码。可能是一个空的基类?
这个问题的答案(下面的链接)让我想知道我的问题是否可能?
Entity Framework Code First fluent API在for循环中设置字段属性
有没有办法更动态地做到这一点?我有多个模型想要执行此操作,并且不想为我要配置的每个实体类克隆 onmodelcreating 中的代码。可能是一个空的基类?
在 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;
}