Более разумный API-интерфейс Entity Framework Codefirst
Мне нужно использовать «datetime2» типа Sql Server во всех DateTime и DateTime? свойства всех объектов объекта. Обычно это делается с использованием свободного API:
modelBuilder.Entity<Mail>().Property(c => c.SendTime).HasColumnType("datetime2");
Однако я бы предпочел НЕ делать это вручную для каждого поля DateTime в каждом типе сущности. (У меня нет общего типа базы, где все свойства DateTime могут быть размещены, потому что свойства DateTime относятся к типам сущностей, где они определены).
Короткий вопрос: каковы мои варианты?
- Столбец идентификатора не применяется к базе данных
- Хотите преобразовать комплексный запрос Linq в хранимую процедуру
- Entity Framework 4.3.1 не удается создать (/ открыть) базу данных
- В базе данных mvc сначала возникают проблемы с edmx / отношениями и вид, показывающий поле id
- Как сопоставить TimeSpan с более чем 24 часами для SQL Server Code First?
Долгий вопрос: я рассматривал возможность использования рефлексии и делал попытку, но это стало очень грязным, поскольку кажется, что свободный 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?
- Импорт SQL-контейнеров CONTAINS () в качестве определенной модели
- LINQ: как выбрать определенные столбцы с помощью IQueryable ()
- Композитные индексы, не работающие над отношениями в Entity Framework
- VB.Net LINQ эквивалент SQL
- Entity Framework - грамотно загружать графический объект с помощью хранимых процедур
- Использовать внутреннее соединение, если запись существует, иначе использовать левое соединение
- SQL Server, какова современная технология наилучшего случая ORM для .Net?
- Как я могу вернуть данные табличной строки из динамической хранимой процедуры Entity Framework?
Существует гораздо лучший подход. К сожалению, этот подход основан на пользовательских соглашениях, которые будут доступны в EF6. Вы можете попробовать EF6 Alpha 2 и сами играть с пользовательскими соглашениями – в пошаговом руководстве содержится пример с вашим точным требованием.
Чтобы решить вашу проблему с отражением, проверьте эту статью в блоге . Он описывает код для генерации отображений с отражением (должен быть связан проект с открытым исходным кодом ).