我需要在所有的 DateTime 和 DateTime 上使用 Sql Server 的“datetime2”类型吗?我所有实体对象的属性。这通常使用 fluent API 完成,如下所示:
modelBuilder.Entity<Mail>().Property(c => c.SendTime).HasColumnType("datetime2");
但是,我不希望为每个实体类型中的每个 DateTime 字段手动执行此操作。(我没有可以放置所有 DateTime 属性的通用基本类型,因为 DateTime 属性特定于定义它们的实体类型)。
简短的问题:我有什么选择?
长问题:我正在考虑使用反射并进行了尝试,但它变得非常混乱,因为流式 API 似乎不太适合这种工作,因为我必须通过反射调用通用流式 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);
}
这在这一行失败:
var dateTimePropertyConfiguration = propertyMethod.Invoke(entityTypeConfiguration, new object[] {lambdaExpression});
出现此错误(Entities.Order 是我的具有 DateTime 属性的实体对象之一):
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]]]
任何人都可以用这种反射方法或更好的方法帮助我,向我展示一种更简单的方法来避免手动编写大量流利的 api 东西吗?