C# 实体框架代码首次迁移在SQL Server中失败

C# 实体框架代码首次迁移在SQL Server中失败,c#,entity-framework,entity-framework-6,C#,Entity Framework,Entity Framework 6,使用Entity Framework 6和SQL Server,我在EF进行迁移时遇到以下错误: 无法更新数据库以匹配当前模型,因为存在挂起的更改,并且禁用了自动迁移。将挂起的模型更改写入基于代码的迁移或启用自动迁移。将DbMigrationsConfiguration.AutomaticMiggrationsEnabled设置为true以启用自动迁移 MySQL的一切都非常好 没有变化。运行另一个添加迁移会导致向上/向下清空方法: public partial class Two : DbMi

使用Entity Framework 6和SQL Server,我在EF进行迁移时遇到以下错误:

无法更新数据库以匹配当前模型,因为存在挂起的更改,并且禁用了自动迁移。将挂起的模型更改写入基于代码的迁移或启用自动迁移。将DbMigrationsConfiguration.AutomaticMiggrationsEnabled设置为true以启用自动迁移

MySQL的一切都非常好

没有变化。运行另一个添加迁移会导致向上/向下清空方法:

public partial class Two : DbMigration
{
    public override void Up()
    {
    }

    public override void Down()
    {
    }
}
DBMigOptionsConfiguration类:

此外,检查迁移历史,似乎一切都井然有序

我做错了什么

更新: 临时启用自动迁移以查看它所做的更改,它会将所有时间列的精度/刻度数从16/7更改为8/0。我不明白为什么它只创建了一个精度,然后希望它们以后有一个不同的精度

更新2,查询:

以下是创建相关表的查询:

CREATE TABLE [dbo].[Instruments] (
[ID] [int] NOT NULL IDENTITY,
[Symbol] [nvarchar](255),
[UnderlyingSymbol] [nvarchar](255),
[Name] [nvarchar](255),
[PrimaryExchangeID] [int],
[ExchangeID] [int],
[Type] [int] NOT NULL,
[Multiplier] [int],
[Expiration] [datetime],
[OptionType] [int],
[Strike] [decimal](16, 8),
[Currency] [nvarchar](25),
[MinTick] [decimal](16, 8),
[Industry] [nvarchar](255),
[Category] [nvarchar](255),
[Subcategory] [nvarchar](255),
[IsContinuousFuture] [bit] NOT NULL,
[ValidExchanges] [varchar](max),
[DatasourceID] [int] NOT NULL,
[ContinuousFutureID] [int],
[SessionsSource] [int] NOT NULL,
[SessionTemplateID] [int],
[DatasourceSymbol] [nvarchar](255),
CONSTRAINT [PK_dbo.Instruments] PRIMARY KEY ([ID])
)

CREATE TABLE [dbo].[exchangesessions] ( 
[ID] [int] NOT NULL IDENTITY,
[OpeningTime] [time](3) NOT NULL,
[ClosingTime] [time](3) NOT NULL,
[ExchangeID] [int] NOT NULL,
[IsSessionEnd] [bit] NOT NULL,
[OpeningDay] [int] NOT NULL,
[ClosingDay] [int] NOT NULL,
CONSTRAINT [PK_dbo.exchangesessions] PRIMARY KEY ([ID])
)
下面是自动迁移完成的查询:

ALTER TABLE [dbo].[Instruments] ALTER COLUMN [Expiration] [datetime]

ALTER TABLE [dbo].[exchangesessions] ALTER COLUMN [OpeningTime] [time](3) NOT NULL

ALTER TABLE [dbo].[exchangesessions] ALTER COLUMN [ClosingTime] [time](3) NOT NULL
一些想法: 日期精度-.NET/C有DateTime,SQL server有DateTime和DateTime2。加入公约

public class DateTime2Convention : Convention
{
    public DateTime2Convention()
    {
        this.Properties<DateTime>()
            .Configure(c => c.HasColumnType("datetime2"));
    }
}

创建一个类似的时间,应该解决这个问题

所需的另一件事是生成所需的SQL脚本。您可能需要从表uu MigrationHistory中找到上一次数据库更新的签名MigrationID,并使用它生成脚本,或者使用

Update-Database -Script -SourceMigration:"201312141123260_MbrraceMigrations2" -TargetMigration:"201312191701134_MbrraceMigrations5"
或者省略-Script以使用自动迁移


很抱歉,这是一个不完整的答案,但我希望这能让您继续。

您设置了自动迁移吗?正如您所看到的,AutomaticMigrationsEnabled=false;我不想使用自动迁移。因此,代码和数据库之间的签名存在差异。如何更新数据库?我通过调用database.Initialize在启动时进行更新。这似乎是有区别的,但是:正如我所说的,运行AddMiration并没有发现任何变化。此外,当我启用自动迁移时,实际上不会对数据库进行任何更改。它会生成一系列ALTER查询来更改某些时间列,但实际上根本不会更改它们。我已经用发送的查询更新了问题。
public class DateTime2Convention : Convention
{
    public DateTime2Convention()
    {
        this.Properties<DateTime>()
            .Configure(c => c.HasColumnType("datetime2"));
    }
}
modelBuilder.Conventions.Add(new DateTime2Convention());
protected override void OnModelCreating(DbModelBuilder modelBuilder)
Update-Database -Script -SourceMigration:"201312141123260_MbrraceMigrations2" -TargetMigration:"201312191701134_MbrraceMigrations5"