2013-02-03 3 views
0

Je veux forcer tous mes DateTime dans mon domaine à être datetime2 sur le serveur sql. Je sais que je peux utiliser:Code EF5 first datetime2, construction d'une expression linq

Property(x => x.Field).HasColumnType("datetime2"); 

Dans mes classes dérivées EntityTypeConfiguration.

Mais je voudrais coder quelque chose de moins "verbeux". Je les opérations suivantes:

public static void SetDateTimeColumnType<T>(EntityTypeConfiguration<T> etc) where T : class { 
    Type t = typeof(T); 
    foreach (PropertyInfo pi in t.GetProperties(BindingFlags.Public | BindingFlags.Instance)) { 
     if (pi.PropertyType.Name == "DateTime") { 
      etc.Property(x => (DateTime)pi.GetValue(x)).HasColumnType("datetime2"); 
     } 
    } 
} 

Mais je reçois l'exception suivante:

The expression 'x => Convert(value(EFVIPRepository.ContextUtilities+<>c__DisplayClass0`1[ValkirIP.Domain.Entities.IPRight]).pi.GetValue(x))' 
is not a valid property expression. 
The expression should represent a property: C#: 't => t.MyProperty' VB.Net: 'Function(t) t.MyProperty'. 
Use dotted paths for nested properties: C#: 't => t.MyProperty.MyProperty' VB.Net: 'Function(t) t.MyProperty.MyProperty'. 

Je pense que ma vraie question est de savoir comment construire une « propriété expresssion » du nom de la propriété, si possible.

Nous vous remercions à l'avance

===== ===== EDIT

J'essaie aussi

Expression expr = Expression.Property(System.Linq.Expressions.Expression.Variable(t), pi); 
etc.Property((Expression<Func<T, DateTime>>)expr).HasColumnType("datetime2"); 

à l'exception suivante:

Impossible d'effectuer un cast d'un objet de type 'System.Linq.Expressions.PropertyExpression' en type 'System.Linq.Expressions.Expression`1[System.Func`2[ValkirIP.Domain.Entities.IPRight,System.DateTime]]'. 

Répondre

1

Vous doit construire correctement Expression Tree.

Essayez ceci:

public static void SetDateTimeColumnType<T>(EntityTypeConfiguration<T> etc) where T : class 
{ 
    Type t = typeof(T); 
    foreach (PropertyInfo pi in t.GetProperties(BindingFlags.Public | BindingFlags.Instance)) 
    { 
     if (pi.PropertyType.Name == "DateTime") 
     { 
      var parameter = Expression.Parameter(t, "x"); 
      var property = Expression.Property(parameter, pi.Name); 
      var lmbd Expression.Lambda<Func<T, DateTime>>(property, parameter); 
      etc.Property(lmbd).HasColumnType("datetime2"); 
     } 
    } 
} 
Questions connexes