Entity framework 4 实体框架4.3.1代码优先:已创建数据库,但未创建表

Entity framework 4 实体框架4.3.1代码优先:已创建数据库,但未创建表,entity-framework-4,ef-code-first,sql-server-ce,entity-framework-migrations,Entity Framework 4,Ef Code First,Sql Server Ce,Entity Framework Migrations,今天我将一个旧应用程序从EF4.2迁移到EF4.3.1。 在我的应用程序中,我使用的是CodeFirst,但在迁移之后它停止了工作,并且找不到原因。 为了解决任何其他可能的问题,我决定创建一个小型控制台应用程序,并使用ADO团队发布的数据迁移演练: 我完全复制了博客的代码,但没有正常工作(创建数据库、创建模式和插入博客),而是出现了一些错误: 只创建数据库,但不创建表 从字符串转换日期时间时,我收到此错误。转换失败。“ 所有这些都在SQLServer2005Express上 我使用SQL

今天我将一个旧应用程序从EF4.2迁移到EF4.3.1。 在我的应用程序中,我使用的是CodeFirst,但在迁移之后它停止了工作,并且找不到原因。 为了解决任何其他可能的问题,我决定创建一个小型控制台应用程序,并使用ADO团队发布的数据迁移演练:

我完全复制了博客的代码,但没有正常工作(创建数据库、创建模式和插入博客),而是出现了一些错误:

  • 只创建数据库,但不创建表
  • 从字符串转换日期时间时,我收到此错误。转换失败。“
所有这些都在SQLServer2005Express上

我使用SQL Compact尝试了相同的方法,但结果相同(错误不同):

  • 只创建数据库(在本例中是bin文件夹中的sdf文件),而不创建表
  • 我发现错误
    指定日期或时间日期部分的格式无效。[String=2012-04-19T13.21.04.364]
我认为在这两种情况下,问题都在于EF希望作为第一次迁移进入的行:

INSERT INTO [__MigrationHistory] ([MigrationId], [CreatedOn], [Model], [ProductVersion]) 
VALUES ('201204191321184_init', '2012-04-19T13.21.04.364',  ...., '4.3.1');
显然,.的格式是错误的,至少在我的语言环境中,应该是:

这是一个bug还是什么?它以前总是和其他datetime一起工作

更新 我尝试将其作为显式迁移运行,并使用-verbose标志集应用迁移,结果如下:

PM> Update-Database -Verbose
Using NuGet project 'ConsoleApplication2'.
Using StartUp project 'ConsoleApplication2'.
Target database is: '|DataDirectory|ConsoleApplication2.ConsoleApplication1.BlogContext.sdf' (DataSource: |DataDirectory|ConsoleApplication2.ConsoleApplication1.BlogContext.sdf, Provider: System.Data.SqlServerCe.4.0, Origin: Convention).
Applying explicit migrations: [201204191356197_Initial].
Applying explicit migration: 201204191356197_Initial.
CREATE TABLE [Blogs] (
    [BlogId] [int] NOT NULL IDENTITY,
    [Name] [nvarchar](4000),
    CONSTRAINT [PK_Blogs] PRIMARY KEY ([BlogId])
)
CREATE TABLE [__MigrationHistory] (
    [MigrationId] [nvarchar](255) NOT NULL,
    [CreatedOn] [datetime] NOT NULL,
    [Model] [image] NOT NULL,
    [ProductVersion] [nvarchar](32) NOT NULL,
    CONSTRAINT [PK___MigrationHistory] PRIMARY KEY ([MigrationId])
)
[Inserting migration history record]
System.Data.SqlServerCe.SqlCeException (0x80004005): The format of the specified date or time datepart is not valid. [ String = 2012-04-19T13.56.45.437 ]
   at System.Data.SqlServerCe.SqlCeCommand.ProcessResults(Int32 hr)
   at System.Data.SqlServerCe.SqlCeCommand.ExecuteCommandText(IntPtr& pCursor, Boolean& isBaseTableCursor)
   at System.Data.SqlServerCe.SqlCeCommand.ExecuteCommand(CommandBehavior behavior, String method, ResultSetOptions options)
   at System.Data.SqlServerCe.SqlCeCommand.ExecuteNonQuery()
   at System.Data.Entity.Migrations.DbMigrator.ExecuteSql(DbTransaction transaction, MigrationStatement migrationStatement)
   at System.Data.Entity.Migrations.Infrastructure.MigratorLoggingDecorator.ExecuteSql(DbTransaction transaction, MigrationStatement migrationStatement)
   at System.Data.Entity.Migrations.DbMigrator.ExecuteStatements(IEnumerable`1 migrationStatements)
   at System.Data.Entity.Migrations.Infrastructure.MigratorBase.ExecuteStatements(IEnumerable`1 migrationStatements)
   at System.Data.Entity.Migrations.DbMigrator.ExecuteOperations(String migrationId, XDocument targetModel, IEnumerable`1 operations, Boolean downgrading)
   at System.Data.Entity.Migrations.DbMigrator.ApplyMigration(DbMigration migration, DbMigration lastMigration)
   at System.Data.Entity.Migrations.Infrastructure.MigratorLoggingDecorator.ApplyMigration(DbMigration migration, DbMigration lastMigration)
   at System.Data.Entity.Migrations.DbMigrator.Upgrade(IEnumerable`1 pendingMigrations, String targetMigrationId, String lastMigrationId)
   at System.Data.Entity.Migrations.Infrastructure.MigratorLoggingDecorator.Upgrade(IEnumerable`1 pendingMigrations, String targetMigrationId, String lastMigrationId)
   at System.Data.Entity.Migrations.DbMigrator.Update(String targetMigration)
   at System.Data.Entity.Migrations.Infrastructure.MigratorBase.Update(String targetMigration)
   at System.Data.Entity.Migrations.Design.ToolingFacade.UpdateRunner.RunCore()
   at System.Data.Entity.Migrations.Design.ToolingFacade.BaseRunner.Run()
The format of the specified date or time datepart is not valid. [ String = 2012-04-19T13.56.45.437 ]
更新2 我安装了SQL Server Profiler,并分析了那里正在发生的事情。 我通过QueryAnalyzer一个接一个地执行了所有语句,失败的是,如上所述,插入迁移

INSERT INTO [__MigrationHistory] ([MigrationId], [CreatedOn], [Model], [ProductVersion]) VALUES ('201204231416585_InitialCreate', '2012-04-23T14.16.59.038Z', ...., '4.3.1')
将数据时间字符串的格式从
2012-04-23T14.16.59.038Z
更改为
2012-04-23T14:16:59.038Z
时,命令执行完毕,因此我猜EF以与我的语言环境不兼容的格式发送数据时间

多谢各位
Simone

多亏了ADO.NET团队,这是迁移代码中的一个bug。 显然,他们在为DateTime字段生成代码时忘记了指定InvariantCulture,所以它可以在EN语言环境中工作,但在其他语言环境中不工作

要解决此问题,请在等待正式修复时,指定一个自定义SqlGenerator,该生成器将覆盖
Generate(DateTime defaultValue)
方法:

class FixedSqlGenerator : SqlServerMigrationSqlGenerator
{
    protected override string Generate(DateTime defaultValue)
    {
        return "'" + defaultValue.ToString("yyyy-MM-ddTHH:mm:ss.fffK", CultureInfo.InvariantCulture) + "'";
    }
}
然后在配置类中指定新的SqlGenerator:

SetSqlGenerator("System.Data.SqlClient", new FixedSqlGenerator());
如果只想在手动迁移中使用它,那么就足够了,如果只需要CodeFirst,那么必须在应用程序启动代码或DbContext中指定配置

Database.SetInitializer(new MigrateDatabaseToLatestVersion<BlogContext, Migrations.Configuration>());
Database.SetInitializer(新的MigrateDatabaseToLatestVersion());

HTH

我在一个全新的项目中遇到了同样的问题,在我的例子中,我通过在web.config中指定正确的文化来解决它

<globalization enableClientBasedCulture="false" culture="en-US" />


Hi Simone,db机器的区域设置和数据库的排序规则是什么?奇怪的是,T-SQL通过SSMS thoughDB机器(我的机器)运行良好,是吗,db的排序规则是法语,这可能解释了SQL Express(即使2012-04-19T13.21.04.364应该是不变格式)。但是SQL Compact在应用程序的同一上下文中运行,这应该不是问题。@CodeClimber-看看这个链接是否有帮助(我的另一篇关于类似问题的文章,以下几点应该可以帮助您了解thorugh,根据我的经验,主要是关于迁移、初始化和可能的连接字符串)-让我知道,我会发布更全面的答案。日期是由迁移生成的吗?我相信有效的格式是“2012-04-19T13:21:04.364”而不是“2012-04-19T13.21.04.364”(冒号与点分隔小时与分钟,分与秒)我一直试图在本地计算机上重新创建此错误,但没有成功。您是否有可能向我们发送一个重新创建此错误的小解决方案?如果有,请使用我们团队博客上的链接让我们知道。