我使用SQL Server 2008中我们最近改为使用上的实体框架项目工作datetime2
字段类型很多我们的日期,因为我们需要的精度。
这工作对我们的生活和发展数据库罚款,但由于我们的终端到终端的测试的一部分,我们一直在使用SQL Server CE 4.0,它不支持datetime2
类型。 当下实体框架尝试构建它返回一系列这样的异常的数据库:
error 0040: The Type datetime2 is not qualified with a namespace or alias. Only primitive types can be used without qualification.
显然,在改变我们的测试目的的生产代码没有价值,所以有没有办法来告诉它的转换datetime2
值到正规datetime
或将其转换为varchar
?
该测试的目的是确保一切从数据层到接口工作正常,所以如果有实现这种测试可能提供有用的选择一个更好的办法。
您可以使用SQL Server 2012的LocalDB而不是CE会更好。 我认识到,使用SQL Server 2012中可能引入潜在的兼容性问题(虽然它确实不应该),但的LocalDB是一个完整的SQL-Server功能的基于文件的数据库。 它支持DATETIME2
最后,我找到了解决这一问题的作品足以使终端到终端的测试配置我一起工作。 我去的解决方案是使用一种特殊的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>();
}
}
通过替换在我的测试类有TestDataContext正规的DataContext我已经崩溃了没有的SQL Server CE相同的行为。