2016-12-06 8 views
0

У меня есть следующие миграции Я пытаюсь применить:Добавить поле и присвоить значение для всех существующих записей

public override void Up() 
{ 
    CreateTable(
     "dbo.pltblQuoteRoHSStatus", 
     c => new 
      { 
       QuoteRoHSStatusID = c.Int(nullable: false, identity: true), 
       Status = c.String(nullable: false, maxLength: 20), 
      }) 
     .PrimaryKey(t => t.QuoteRoHSStatusID) 
     .Index(t => t.Status, unique: true, name: "IX_RoHSStatusIndex"); 

    AddColumn("dbo.tblQuoteGeneral", "QuoteRoHSStatusID", c => c.Int(nullable: false)); 
    CreateIndex("dbo.tblQuoteGeneral", "QuoteRoHSStatusID"); 
    AddForeignKey("dbo.tblQuoteGeneral", "QuoteRoHSStatusID", "dbo.pltblQuoteRoHSStatus", "QuoteRoHSStatusID", cascadeDelete: true); 
    DropColumn("dbo.tblQuoteGeneral", "RoHS"); 
} 

Когда я бегу update-database, я получаю следующее сообщение об ошибке:

The ALTER TABLE statement conflicted with the FOREIGN KEY constraint "FK_dbo.tblQuoteGeneral_dbo.pltblQuoteRoHSStatus_QuoteRoHSStatusID". The conflict occurred in database "WebPDC", table "dbo.pltblQuoteRoHSStatus", column 'QuoteRoHSStatusID'.

я имеют существующие записи в tblQuoteGeneral. Поэтому мне нужно присвоить значение (3) QuoteRoHSStatusID для всех существующих записей. Я попробовал следующую модификацию автоматически сгенерированной миграции, показанной выше:

public override void Up() 
{ 
    CreateTable(
     "dbo.pltblQuoteRoHSStatus", 
     c => new 
     { 
      QuoteRoHSStatusID = c.Int(nullable: false, identity: true), 
      Status = c.String(nullable: false, maxLength: 20), 
     }) 
     .PrimaryKey(t => t.QuoteRoHSStatusID) 
     .Index(t => t.Status, unique: true, name: "IX_RoHSStatusIndex"); 

    AddColumn("dbo.tblQuoteGeneral", "QuoteRoHSStatusID", c => c.Int(nullable: true)); 
    Sql("UPDATE dbo.tblQuoteGeneral SET QuoteRoHSStatusID = 3"); 
    AlterColumn("dbo.tblQuoteGeneral", "QuoteRoHSStatusID", c => c.Int(nullable: false)); 

    CreateIndex("dbo.tblQuoteGeneral", "QuoteRoHSStatusID"); 
    AddForeignKey("dbo.tblQuoteGeneral", "QuoteRoHSStatusID", "dbo.pltblQuoteRoHSStatus", "QuoteRoHSStatusID", cascadeDelete: true); 
    DropColumn("dbo.tblQuoteGeneral", "RoHS"); 
} 

Я все еще получаю ту же ошибку. Что я делаю не так?

EDIT: Я хотел бы выполнить вышеуказанное в одной миграции.

+0

http://stackoverflow.com/questions/22665416/ef-6-code-based-migration-add-not-null-property-to- существующий объект –

+0

** @ E-Bat **, спасибо, что указал мне на этот вопрос. Я уже знал, что могу разделить миграцию. Я искал способ сделать это за один переход. Я ответил на свой вопрос, рассказывая, как это можно сделать при одном переносе. – Linger

+0

О, я пропустил Редактировать. –

ответ

2

Я понял, в чем была моя проблема. Я отправлю его только кому-нибудь, что может показаться ему полезным. Я сделал все правильно в моей модификации для автоматически сгенерированной миграции, за исключением заполнения таблицы pltblQuoteRoHSStatus со значениями. Как я могу запустить UPDATE dbo.tblQuoteGeneral SET QuoteRoHSStatusID = 3 без записи в pltblQuoteRoHSStatus с ID из 3. Именно это и вызывало ошибку из-за ограничения внешнего ключа.

Итак, вот мой рабочий код:

public override void Up() 
{ 
    CreateTable(
     "dbo.pltblQuoteRoHSStatus", 
     c => new 
     { 
      QuoteRoHSStatusID = c.Int(nullable: false, identity: true), 
      Status = c.String(nullable: false, maxLength: 20), 
     }) 
     .PrimaryKey(t => t.QuoteRoHSStatusID) 
     .Index(t => t.Status, unique: true, name: "IX_RoHSStatusIndex"); 

    AddColumn("dbo.tblQuoteGeneral", "QuoteRoHSStatusID", c => c.Int(nullable: true)); 
    Sql("INSERT INTO dbo.pltblQuoteRoHSStatus (Status) VALUES ('Compliant') "); 
    Sql("INSERT INTO dbo.pltblQuoteRoHSStatus (Status) VALUES ('Noncompliant') "); 
    Sql("INSERT INTO dbo.pltblQuoteRoHSStatus (Status) VALUES ('Unknown') "); 
    Sql("UPDATE dbo.tblQuoteGeneral SET QuoteRoHSStatusID = 3"); 
    AlterColumn("dbo.tblQuoteGeneral", "QuoteRoHSStatusID", c => c.Int(nullable: false)); 

    CreateIndex("dbo.tblQuoteGeneral", "QuoteRoHSStatusID"); 
    AddForeignKey("dbo.tblQuoteGeneral", "QuoteRoHSStatusID", "dbo.pltblQuoteRoHSStatus", "QuoteRoHSStatusID", cascadeDelete: true); 
    DropColumn("dbo.tblQuoteGeneral", "RoHS"); 
} 
1

Делает это в двух миграциях:

В первом, добавьте поле с (обнуляемым) внешним ключом. Примените эту миграцию к базе данных, а затем обновите поле в базе данных скриптом.

Затем добавьте вторую миграцию, чтобы сделать поле непустым.

+0

Это тот подход, который я использовал в прошлом. Я думал, что будет/должен быть способ сделать это за одну миграцию. Могу ли я сделать это с одной миграцией? – Linger

+0

Я так не верю, нет. – Amy

+0

вы можете сделать все это за одну миграцию. Я понял, что я делаю неправильно, и отправил его в качестве ответа. Я проголосовал за ваш ответ, так как он будет работать, и я разбил его на две отдельные миграции в прошлом. – Linger