2013-03-28 98 views
1

我使用Entity Framework 5.0和電動工具反向設計了一個小型數據庫。然後我開始開發一個網站。我遇到了一個問題,因爲我忘記了在IDENTITY列中的某個表上創建ID列。如何使用實體框架dbmigration將列更改爲標識?

所以我增加了一個代碼先遷移和包管理器控制檯使用update-database命令運行它。這裏是我寫的「Up」方法:

public override void Up() 
    { 
     Sql("DELETE FROM dbo.Sections"); 
     Sql("DELETE FROM dbo.QuestionInstances"); 

     DropForeignKey("dbo.SectionInstances", "SectionID", "dbo.Sections"); 
     DropForeignKey("dbo.QuestionInstances", "SectionID", "dbo.Sections"); 

     DropTable("dbo.Sections"); 

     CreateTable(
      "dbo.Sections", 
      c => new 
      { 
       ID = c.Int(nullable: false, identity: true), 
       UniqueDescription = c.String(nullable: false, maxLength: 50), 
       Heading = c.String(maxLength: 500), 
      }) 
      .PrimaryKey(t => t.ID); 

     AddForeignKey("dbo.SectionInstances", "SectionID", "dbo.Sections"); 
     AddForeignKey("dbo.QuestionInstances", "SectionID", "dbo.Sections"); 
    } 

我檢查數據庫,它已被成功修改。

我期待實體框架更新其模型,並停止顯式設置ID,但它會出現我錯了,因爲當我嘗試保存我現在得到此錯誤:「不能插入標識列的顯式值表「節」當IDENTITY_INSERT設置爲OFF」

如何獲得實體框架認識到,列現在是標識列?

+0

你真的有一個代碼第一種模式,或者是你使用EDMX文件? – 2013-03-28 10:26:33

+0

我使用的是代碼優先。沒有EDMX。 – Colin 2013-03-28 10:30:12

+0

好的 - 我想你有用'DatabaseGeneratedOption.None'配置的Id屬性。 Powertools在第一次逆向工程時可能會這樣做,所以您必須手動刪除它,因爲現在您已將其作爲標識列。 – 2013-03-28 10:34:02

回答

3

由於您在Id列未設置爲IDENTITY的情況下對數據庫進行反向工程,因此已經爲實體的Id屬性設置了DatabaseGeneratedOption.None生成的代碼第一個模型。

這導致EF創建具有ID設置,更改列身份後不再起作用的INSERT語句。

您必須手動修復該配置,方法是將其設置爲DatabaseGeneratedOption.Identity或將其完全刪除,因爲這是整數字段的默認值。

+2

BTW。當我將Map類更改爲與我手動創建的數據庫遷移相匹配時,框架將其作爲對模型的更改進行了挑選。所以我跑了添加遷移。它使用以下代碼創建了一個Up()方法:「AlterColumn(」dbo.Sections「,」ID「,c => c.Int(nullable:false,identity:true));」 update-database -verbose顯示這會產生sql「ALTER TABLE [dbo]。[Sections] ALTER COLUMN [ID] [int] NOT NULL」 - 這實際上並沒有改變任何東西。正確的方法是1.改變映射文件2.呼叫附加遷移3.變化所產生的遷移代碼,以刪除並重新創建表 – Colin 2013-03-28 16:17:46

+2

當然可以。通常的工作流程是改變代碼的第一個模型,通過調用'add-migration'來改變遷移的範圍,然後通過調用'update-database'來更新數據庫。遷移功能不會知道您手動更改了數據庫,因此它會創建一個遷移來完成此操作。你可以調用'Add-Migration name -IgnoreChanges'。這將創建一個空的遷移,忽略對模型的更改。 – 2013-03-28 16:40:41

相關問題