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?