2014-01-19 1 views
1

Использование Entity Framework 6 и SQL Server, я получаю следующее сообщение об ошибке, когда EF делает миграционную вещь:Entity Framework Code-First Migration завершает работу с SQL Server

Невозможно обновить базу данных в соответствии с текущей моделью, потому что есть ожидающие изменения, и автоматическая миграция отключена. Либо записывайте ожидающие изменения модели в миграцию на основе кода, либо разрешайте автоматическую миграцию. Установите для параметра DbMigrationsConfiguration.AutomaticMigrationsEnabled значение true, чтобы включить автоматическую миграцию.

Все работает отлично с MySQL.

Изменений не было. Запуск других "Add-миграция" результаты в пустых вверх()/вниз() методы:

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

    public override void Down() 
    { 
    } 
} 

DbMigrationsConfiguration класса:

internal sealed class Configuration : DbMigrationsConfiguration<MyDBContext> 
{ 
    public Configuration() 
    { 
     AutomaticMigrationsEnabled = false; 
     SetSqlGenerator("System.Data.SqlClient", new SqlServerMigrationSqlGenerator()); 
    } 

    protected override void Seed(MyDBContext context) 
    { 
     ... 
    } 
} 

DbContext.OnModelCreating:

protected override void OnModelCreating(DbModelBuilder modelBuilder) 
    { 
     Database.SetInitializer(new MigrateDatabaseToLatestVersion<MyDBContext, Configuration>()); 

     ... 
    } 

Кроме того, исследующий __MigrationHistory кажется, что все в порядке.

Что я делаю неправильно?

Обновление: Включение автоматических миграций временно, чтобы увидеть, какие изменения он внесет, он изменяет все значения точности/шкалы времени столбца от 16/7 до 8/0. Я не понимаю, почему он создает их с одной точностью, а затем хочет их иметь другую позже, хотя ...

Update 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 
+0

Установили ли вы автоматическую миграцию? –

+0

Как вы можете видеть, AutomaticMigrationsEnabled = false; Я не хочу использовать автоматическую миграцию. –

+0

Итак, существует разница между сигнатурой между кодом и базой данных. Как вы обновляете базу данных? –

ответ

0

Некоторые мысли: Дата точности - .Не T/C# имеет DateTime, SQL-сервер имеет DateTime и DateTime2. Добавить соглашение

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) 

Создать подобный один для времени, и это должно решить эту проблему.

Другая вещь, которая требуется для генерации SQL-скрипта. Вы можете нужно найти подпись (MigrationID) последнего обновления базы данных из таблицы __MigrationHistory и использовать, чтобы либо создать сценарий, используя

Update-Database -Script -SourceMigration:"201312141123260_MbrraceMigrations2" -TargetMigration:"201312191701134_MbrraceMigrations5" 

или опустить -Script использовать автоматические миграции.

Извините, это немного неоднозначный ответ, но я надеюсь, что это вас устроит.