В EF6 вы сделали бы это с custom conventions. Должно быть не более двух строк кода.
В EF5 вам, вероятно, придется искать типы объектов с помощью отражения, а затем настраивать их, как описано в приведенной выше ссылке. Вот код, который я придумал (я украл метод для построения выражения для доступа к свойству из post you linked above):
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;
}
насчет EF 5, мое понимание EF 6 все еще находится в бета-версии? – Shawn
В EF5 вам нужно будет принять маршрут Reflection, как показано в сообщении, которое вы связали. Что касается EF6, находящегося в бета-версии - VS2013 RC - это релиз «go live», и EF6 является его частью. Заключительный выпуск EF6 будет поставляться с VS2013, который, согласно этому, скоро будет опубликован в http://www.zdnet.com/microsoft-delivers-near-final-visual-studio-2013-release-candidate-7000020423/. – Pawel
У меня проблема. Я не эксперт по размышлениям/дженерикам, поэтому мне трудно понять, как это сделать. – Shawn