2012-12-20 5 views
11

すべてのDateTimeとDateTimeでSQL Serverの "datetime2"型を使用する必要がありますか?すべての私のエンティティオブジェクトのプロパティ。これは通常、このような流暢なAPIで行われます:よりスマートなEntity Framework Codefirst Fluent API

modelBuilder.Entity<Mail>().Property(c => c.SendTime).HasColumnType("datetime2"); 

しかし、私はそれぞれ、すべてのエンティティタイプでそれぞれすべてのDateTimeフィールドのために手動でこれを行うにはないことを好むだろう。 (DateTimeプロパティは定義されているエンティティタイプに固有のものなので、すべてのDateTimeプロパティを配置できる共通の基本タイプはありません)。

短い質問:私のオプションは何ですか?

長い質問:私は反射の使用を検討していましたが、流暢なAPIがこの種の作業にはあまり適していないように思えます。反射。これは、この行に失敗し

protected override void OnModelCreating(DbModelBuilder modelBuilder) { 
     var genericEntityMethod = modelBuilder.GetType().GetMethod("Entity"); 
     var entityTypes = Assembly.GetExecutingAssembly().GetTypes().Where(t => t.IsClass && !t.IsAbstract && t.GetInterface("IEntity") != null); 
     foreach (var t in entityTypes) { 
      var props = t.GetProperties().Where(p => 
       p.GetSetMethod() != null && 
       p.GetGetMethod() != null && 
       (p.PropertyType == typeof (DateTime) || 
       p.PropertyType == typeof(DateTime?))); 
      foreach (var propertyInfo in props) { 
       var entityMethod = genericEntityMethod.MakeGenericMethod(t.GetType()); 
       var entityTypeConfiguration = entityMethod.Invoke(modelBuilder,null); 
       var lambdaExpression = Expression.Lambda(Expression.MakeMemberAccess(Expression.Parameter(t), propertyInfo), Expression.Parameter(t)); 

       //var propertyMethod = entityTypeConfiguration.GetType().GetMethod("Property"); // Cant get this to work 
       var propertyMethods = entityTypeConfiguration.GetType().GetMethods().Where(m => m.ReturnType == typeof(DateTimePropertyConfiguration)).ToList(); 
       var propertyMethod = propertyInfo.PropertyType == typeof (DateTime) ? propertyMethods[0] : propertyMethods[1]; 

       var dateTimePropertyConfiguration = propertyMethod.Invoke(entityTypeConfiguration, new object[] {lambdaExpression}); 
       var hasColumnTypeMethod = entityTypeConfiguration.GetType().GetMethod("HasColumnType"); 
       hasColumnTypeMethod.Invoke(dateTimePropertyConfiguration, new object[]{ "datetime2" }); 
      } 
     } 
     base.OnModelCreating(modelBuilder); 
    } 

:ここに私の厄介な試みです

Object of type 'System.Linq.Expressions.Expression`1[System.Func`2[Entities.Order,System.Nullable`1[System.DateTime]]]' cannot be converted to type 'System.Linq.Expressions.Expression`1[System.Func`2[System.RuntimeType,System.Nullable`1[System.DateTime]]] 
:このエラーで

    var dateTimePropertyConfiguration = propertyMethod.Invoke(entityTypeConfiguration, new object[] {lambdaExpression}); 

(Entities.Orderは、DateTimeプロパティを持つ私のエンティティオブジェクトの一つです)

誰でもこのリフレクションアプローチ以上で私を助けてくれますか?流暢なAPIをたくさん手作業で書く必要を避ける簡単な方法を教えてください。

答えて

4

さらに良いアプローチがあります。残念ながら、このアプローチはEF6で利用可能になるカスタム規約に基づいています。 EF6 Alpha 2を試してみて、自分自身でカスタムコンベンションで遊ぶことができます - walkthroughには厳密な要件の例が含まれています。

反射の問題を解決するには、blog articleをご確認ください。それは、リフレクションを伴うマッピングを生成するためのコードを記述しています(関連する必要がありますopen source project)。

関連する問題