gpt4 book ai didi

entity-framework-4 - Entity Framework 4.3.1 代码优先 : database created but tables are not

转载 作者:行者123 更新时间:2023-12-04 07:57:08 25 4
gpt4 key购买 nike

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

http://blogs.msdn.com/b/adonet/archive/2012/02/09/ef-4-3-code-based-migrations-walkthrough.aspx

我完全复制了博客的代码,但没有正常工作(创建数据库、创建架构和插入博客),我收到了一些错误:

  • 只创建了数据库,但没有创建表
  • 我收到此错误 Conversion failed when converting datetime from character string. "

  • 所有这些都在 SQL Server 2005 express 上进行。

    我使用 SQL Compact 尝试了相同的方法,但结果相同(不同的错误):
  • 仅创建了数据库(在本例中为 bin 文件夹中的 sdf 文件),但未创建表
  • 我收到错误 The format of the specified date or time datepart is not valid. [ 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');

    显然是带有 .是错误的,至少在我的语言环境中,它应该是:

    这是错误还是什么?它之前总是与其他日期时间一起使用。

    更新
    我尝试将它作为显式迁移运行,并使用 -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,并分析了那里发生的事情。
    我通过查询分析器一一执行了所有语句,失败的语句是,如上所述,插入迁移。
    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 正在以与我的语言环境不兼容的格式发送数据时间。

    谢谢
    西蒙娜

    最佳答案

    感谢 ADO.NET 团队,这是迁移代码中的一个错误。
    显然,他们在为 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) + "'";
    }
    }

    然后在Configuration类中指定新的SqlGenerator:
    SetSqlGenerator("System.Data.SqlClient", new FixedSqlGenerator());

    如果你只想在手动迁移中使用它就足够了,如果你只需要CodeFirst,则必须在应用程序启动代码或DbContext中指定配置。
    Database.SetInitializer(new MigrateDatabaseToLatestVersion<BlogContext, Migrations.Configuration>());

    HTH

    关于entity-framework-4 - Entity Framework 4.3.1 代码优先 : database created but tables are not,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10229190/

    25 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com