2013-10-10 2 views
1

Ответ на этот вопрос (ссылка ниже) заставляет меня задаться вопросом, возможен ли мой вопрос?Entity Framework Устанавливает все десятичные прецизионные значения в модели программно

Entity Framework Code First fluent API setting field properties in a for loop

Есть ли способ сделать это более динамично? У меня есть несколько моделей, с которыми я хочу это сделать, и не хочу клонировать код в onmodelcreating для каждого класса сущности, который я хочу настроить. Возможно, пустой базовый класс?

ответ

2

В 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; 
} 
+0

насчет EF 5, мое понимание EF 6 все еще находится в бета-версии? – Shawn

+0

В 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

+0

У меня проблема. Я не эксперт по размышлениям/дженерикам, поэтому мне трудно понять, как это сделать. – Shawn

Смежные вопросы