2013-02-03 67 views
0

我想強制我的域中的所有DateTime在sql server上都是datetime2。我知道我可以使用:EF5代碼第一個datetime2,構建linq表達式

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

在我的EntityTypeConfiguration派生類。

但我想代碼少「冗長」。我嘗試以下方法:

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

,但我得到以下異常:

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'. 

我想我真正的問題是如何建立從屬性的名稱是「物業expresssion」,如果可能的話。

預先感謝您

=====編輯=====

我也嘗試

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

但下列情況除外:

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]]'. 

回答

1

你必須建立正確的Expression Tree

試試這個:

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