0

ドメイン内のすべての DateTime を、SQL サーバー上で強制的に datetime2 にしたいと考えています。私は使用できることを知っています:

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

私の本当の質問は、可能であれば、プロパティの名前から「プロパティ式」を構築する方法だと思います。

前もって感謝します

=====編集=====

私もやってみる

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

1 に答える 1

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");
        }
    }
}
于 2013-02-03T16:49:10.130 に答える