Более разумный API-интерфейс Entity Framework Codefirst

Мне нужно использовать «datetime2» типа Sql Server во всех DateTime и DateTime? свойства всех объектов объекта. Обычно это делается с использованием свободного 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?

Существует гораздо лучший подход. К сожалению, этот подход основан на пользовательских соглашениях, которые будут доступны в EF6. Вы можете попробовать EF6 Alpha 2 и сами играть с пользовательскими соглашениями – в пошаговом руководстве содержится пример с вашим точным требованием.

Чтобы решить вашу проблему с отражением, проверьте эту статью в блоге . Он описывает код для генерации отображений с отражением (должен быть связан проект с открытым исходным кодом ).

  • Entity Framework не обновляет значение, которое изменяется с помощью триггера
  • Выполнение SQL-запросов Entity Framework
  • Остановить Visual Studio Копирование базы данных MDF в корзину
  • EntityFramework, создающая 130+ соединений
  • Entity Framework 6.1: данный ключ отсутствовал в словаре
  • MVC-EF Обратный инженерный код сначала включает в себя другую таблицу, возвращает значения null, когда должны быть данные
  • Работа с хранимыми процедурами (SQL Server) в WebAPI2
  • (Дополнительно) EF не может вывести схему возврата из хранимой процедуры, выбрав из таблицы #temp
  • Как реализовать подкачку SQL Server с использованием C # и структуры сущностей?
  • Включает ли команда set all соединения в одном пуле?
  • Как избежать раздувания кеша плана с помощью запросов в инфраструктуре сущности
  • Interesting Posts

    TABLOCK vs TABLOCKX

    Что лучше: строка sql или хранимые процедуры?

    TSQL Select Statement с более конкретным LIKE

    Можно ли создать матрицу отчетов в результате, заданный в sql-запросе, с учетом отдельной таблицы базы данных

    Отделите блок TEXT новыми строками

    как присоединиться к серверу sql server

    Ошибка метода / свойства при новом подключении SQL Server

    Мне нужно преобразовать мою базу данных Mysql в базу данных SQL Server 2005

    Получить список уникальных столбцов ограничений (в TSQL)?

    SQLServerException: «Результирующий набор закрыт» при использовании Streams в качестве возвращаемого типа

    Турецкие символы не отображаются в db, когда я использую динамический SQL-запрос

    Доступ к таблице возврата в функции Postgres

    Имеет табличную функцию в таблице возврата T-SQL с переменным числом столбцов

    Столбец INSERT INTO Столбец и стоимость

    Как выбрать регулярное выражение из текста / varchar в MS SQL?

    Давайте будем гением компьютера.