Разрешить Entity Framework 4.5 для использования datetime2 с SQL Server CE4

Я работаю над проектом Entity Framework с использованием SQL Server 2008. Недавно мы перешли на использование datetime2 тип поля для многих наших дат, так как нам нужна точность.

Это отлично работает с нашими живыми и разрабатываемыми базами данных, но в рамках наших комплексных тестов мы использовали SQL Server CE 4.0, который не поддерживает datetime2 тип. В тот момент, когда Entity Framework пытается создать базу данных, он возвращает ряд исключений, подобных этому:

error 0040: The Type datetime2 is not qualified with a namespace or alias. Only primitive types can be used without qualification.

Очевидно, что нет смысла изменять наш производственный код в тестовых целях, поэтому есть ли способ сказать ему преобразовать datetime2 значения к регулярному datetime или преобразовать их в varchar?

Цель теста - убедиться, что все, от уровня данных до интерфейса, работает должным образом, поэтому, если есть лучший способ реализовать этот вид теста, который может предоставить полезную альтернативу.

2 ответа

Решение

В конце концов я нашел решение этой проблемы, которое достаточно для полной конфигурации тестирования, с которой я работаю. Я решил использовать специальный DataContext для обработки запросов Sql Server CE, таким образом:

public class TestDataContext : DataContext 
{

    protected override void  OnModelCreating(System.Data.Entity.DbModelBuilder modelBuilder)
    {
        // list of available Conventions: http://msdn.microsoft.com/en-us/library/system.data.entity.modelconfiguration.conventions(v=vs.103).aspx 

        // Remove the column attributes that cause the datetime2 errors, so that 
        // for SQL Server CE we just have regular DateTime objects rather than using
        // the attribute value from the entity.
        modelBuilder.Conventions.Remove<ColumnAttributeConvention>();

        // Attempt to add back the String Length restrictions on the entities. I havent 
        // tested that this works.
        modelBuilder.Configurations.Add( new ComplexTypeConfiguration<StringLengthAttributeConvention>());

        // SQL Server CE is very sensitive to potential circular cascade deletion problems
        modelBuilder.Conventions.Remove<ManyToManyCascadeDeleteConvention>();
        modelBuilder.Conventions.Remove<OneToManyCascadeDeleteConvention>();

    }

}

Заменив обычный DataContext на TestDataContext в моих тестовых классах, я получаю то же поведение без сбоев SQL Server CE.

Возможно, вам лучше использовать SQL Server 2012 LocalDB, а не CE. Я понимаю, что использование SQL Server 2012 может привести к потенциальным проблемам совместимости (хотя на самом деле это не должно быть), но LocalDB является базой данных на основе файлов с полной функциональностью SQL-Server. Он поддерживает datetime2

Другие вопросы по тегам