2015-04-22 2 views
1

Здесь у меня есть миграция CodeFirst с использованием Ef6Удалить/Добавить «defaultvaluesql» колонки с помощью миграции

public override void Up() 
{ 
    CreateTable(
     "dbo.MyTable", 
     c => new 
      { 
       Id = c.Int(nullable: false, identity: true), 
       Date = c.DateTime(nullable: false, defaultValueSql: "GETUTCDATE()"), 
      }) 
     .PrimaryKey(t => t.Id); 
} 

Но мы обнаружили, что Date не может быть настроена на вставку. Поэтому нам нужно выполнить миграцию, чтобы удалить параметр defaultValueSql на столбце Date.

Я попытался с помощью AlterColumn без defaultValueSql параметра

public override void Up() 
{ 
    AlterColumn("dbo.MyTable", "Date", c => c.DateTime(nullable: false)); 
} 

public override void Down() 
{ 
    AlterColumn("dbo.MyTable", "Date", c => c.DateTime(nullable: false, defaultValueSql: "GETUTCDATE()")); 
} 

работает ни для вставки и обновления Date, ни к определению таблицы.

CREATE TABLE [dbo].[MyTable] (
    [Id] INT  IDENTITY (1, 1) NOT NULL, 
    [Date]  DATETIME  DEFAULT (getutcdate()) NOT NULL, 
); 

Любой человек столкнулся с этой ситуацией, пожалуйста?

+0

Создание конструктора с параметром datatime в качестве параметра делает работу вставки. –

ответ

2

На самом деле, в базе данных, был Constraint создан для defaultValueSql, и я думаю, что этот параметр работает по SYS таблицы, а не MyTable, который приводит к неэффективности моего AlterColumn.

В конце концов, я создал несколько оригинальных команд SQL для моей цели, как следующее:

public override void Up() 
{ 
    Sql(@" 
    DECLARE @sql NVARCHAR(MAX) 
    SELECT @sql = N'alter table [EffectiveDonations] drop constraint ['+d.name+N']' 
    FROM sys.default_constraints 
    WHERE d.parent_object_id = OBJECT_ID(N'MyTable') 
    AND col_name(parent_object_id, parent_column_id) = N'Date' 
    EXEC (@sql) 
    "); 
    Sql("PRINT 'Information: delete [defaultvaluesql]';"); 
} 

public override void Down() 
{ 
    Sql(@"ALTER TABLE [MyTable] ADD DEFAULT getutcdate() FOR [Date]"); 
    Sql("PRINT 'Information: create [defaultvaluesql] for column [Date] of table [MyTable]';"); 
} 

Share надеяться это может быть помощь другим.

1

Попробуйте в два этапа:

public override void Up() 
{ 
    AlterColumn("dbo.MyTable", "Date", c => c.DateTime(nullable: true, 
                 defaultValue: "NULL")); 
    AlterColumn("dbo.MyTable", "Date", c => c.DateTime(nullable: false)); 
} 
+0

Добавил 'CONSTRAINT [DF_dbo.EffectiveDonations_Date] DEFAULT (NULL)', если мы рассмотрели определение tabel. Я добавил некоторые тестовые данные в Seed(), где возникают ошибки _Cannot вставить значение NULL в столбец «Дата», таблицу «MyTable»; столбец не допускает нулей. INSERT не работает. –

Смежные вопросы