2012-12-20 19 views
11

Tüm DateTime ve DateTime'da Sql Server'ın "datetime2" tipini kullanmalı mıyım? tüm varlık nesnelerimin özellikleri. Bu normalde böyle akıcı API ile yapılır:Daha akıllı bir Varlık Framework Codefirst akıcı API

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

Ancak, ben her varlık türü her DateTime alanı için el ile yapmak değil tercih ediyorum. (Tüm DateTime özelliklerinin yerleştirilebileceği ortak bir taban tipim yok, çünkü DateTime özellikleri tanımlandıkları varlık türlerine özgüdür).

Kısa soru: Seçeneklerim nelerdir?

Uzun soru: Yansımayı kullanmayı düşündüm ve atlattım, ama akıcı API bu tür işler için gerçekten uygun değil gibi göründüğü gibi çok dağınıktı çünkü genel akıcı API yöntemlerini çağırmak zorunda kaldım. yansıması. Bu, bu çizgide başarısız

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

: İşte benim dağınık girişimi

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]]] 
: bu hata ile

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

(Entities.Order bir DateTime özelliğine sahip benim varlık nesneleri biridir)

Bu yansıma yaklaşımı veya daha iyi bir şekilde bana yardımcı olabilecek herhangi biri, bana çok fazla akıcı API nesnesi yazmayı önlemek için daha basit bir yol gösterebilir mi?

cevap

4

çok daha iyi bir yaklaşım vardır. Ne yazık ki, bu yaklaşım, EF6'da mevcut olacak özel sözleşmelere dayanmaktadır. EF6 Alpha 2'u deneyebilir ve kendiniz özel kurallarla oynatabilirsiniz - walkthrough tam gereksiniminizle birlikte örnek içerir.

yansıma çek bu blog article ile sorunu çözmek için. Yansıma ile eşlemeler oluşturma kodunu açıklar (ilgili open source project olmalıdır).