2017-12-04 9 views
1

プライマリキーを自動インクリメントに設定して、エンティティフレームワークでコードファーストを使用してテーブルを作成しましたが、その列から自動インクリメントを削除したいと考えています。とき、しかし、Entity Framework 6で主キーからIDを削除できますか?

public partial class removeproducttypeidentity : DbMigration 
{ 
    public override void Up() 
    { 
     DropPrimaryKey("dbo.ProductTypes"); 
     AlterColumn("dbo.ProductTypes", "ProductTypeId", c => c.Int(nullable: false)); 
     AddPrimaryKey("dbo.ProductTypes", "ProductTypeId"); 
    } 

    public override void Down() 
    { 
     DropPrimaryKey("dbo.ProductTypes"); 
     AlterColumn("dbo.ProductTypes", "ProductTypeId", c => c.Int(nullable: false, identity: true)); 
     AddPrimaryKey("dbo.ProductTypes", "ProductTypeId"); 
    } 
} 

public class ProductTypeMap: EntityTypeConfiguration<ProductType> 
{ 
    public ProductTypeMap() 
    { 
     // This is an enum effectively, so we need fixed IDs 
     Property(x => x.ProductTypeId) 
      .HasDatabaseGeneratedOption(DatabaseGeneratedOption.None); 
    } 

} 

および注釈:

public class ProductType 
{ 
    [Required, Key, DatabaseGenerated(DatabaseGeneratedOption.None)] 
    public int ProductTypeId { get; set; } 
    public string ProductTypeName { get; set; } 

} 

そして、どちらの場合も、それらが同じ移行コードを生成し、私は流暢なAPIの両方であることをやってみました私はデータベース上でそのマイグレーションを実行しますが、アイデンティティ仕様はSQL Server 2008データベーステーブルから削除されません。次のように

は、私はまた、明示的に移行してアイデンティティをオフにしてみましたが、それはそれをしなかったのいずれか:

AlterColumn("dbo.ProductTypes", "ProductTypeId", c => c.Int(nullable: false, identity: false)); 

アイデンティティを削除するSQLを指示する別の方法はありますか?

答えて

1

ALTER COLUMNを使用して、列がID列(How to alter column to identity(1,1))であるかどうかを設定することはできません。

代わりに、あなたがする必要があります。

  • 元のテーブルの列を持つ(バックアップDB)
  • CREATE TMP_tableが、アイデンティティに設定されたID列:元から偽
  • SET IDENTITY_INSERT [TMP_Table] ON
  • コピーデータTMPテーブルへ
  • SET IDENTITY_INSERT [TMP_Table] OFF
  • DROP元のテーブル
  • 元のテーブル名に名前を変更TMP_table(EXECUTE sp_rename

ヒント:SQL Management Studioで列を変更し、放出されたスクリプト(SQL SERVER – Add or Remove Identity Property on Column)を点検します。

1

主キーからアイデンティティを削除する場合は、テーブルとそれに関連する任意の外部キーを削除して再作成する必要があります。

列からID指定を削除するには、テーブルを再作成する必要があります。 ALTER TABLE - ALTER COLUMNステートメントを見てください。アイデンティティ仕様を変更(追加または削除)する構文はありません。

流れる参照してくださいサイト:列IからIDを削除するに関与しているものについて説明する回答の両方に

Cant remove identity attribute from PK

Entering keys manually with Entity Framework

EF6: Switching Identity On/Off with a Custom Migration Operation

Remove Identity from Primary Key with Drop and Recreate Table

0

感謝新しいバージョンのoを思いついたf PK列からの同一性の除去を達成する移行。

は、テーブルのすべてのデータを失います。問題のテーブルは列挙型を表すもので、私のシードメソッド(私は最初にIDを削除していたので、PK Idフィールドに使用されている値を指定することができます)によって手動で入力されるためです。 この方法をユーザー入力データに使用しないでください!

public partial class removeproducttypeidentity : DbMigration 
{ 
    public override void Up() 
    { 
     DropForeignKey("dbo.Products", "ProductTypeId", "dbo.ProductTypes"); 
     DropPrimaryKey("dbo.ProductTypes"); 

     DropTable("dbo.ProductTypes"); 

     CreateTable(
       "dbo.ProductTypes", 
       c => new 
       { 
        ProductTypeId = c.Int(nullable: false), 
        ProductTypeName = c.String(), 
       }) 
      .PrimaryKey(t => t.ProductTypeId); 

     AddForeignKey("dbo.Products", "ProductTypeId", "dbo.ProductTypes", "ProductTypeId"); 
    } 

    public override void Down() 
    { 
     DropForeignKey("dbo.Products", "ProductTypeId", "dbo.ProductTypes"); 
     DropPrimaryKey("dbo.ProductTypes"); 

     DropTable("dbo.ProductTypes"); 

     CreateTable(
       "dbo.ProductTypes", 
       c => new 
       { 
        ProductTypeId = c.Int(nullable: false, identity: true), 
        ProductTypeName = c.String(), 
       }) 
      .PrimaryKey(t => t.ProductTypeId); 

     AddForeignKey("dbo.Products", "ProductTypeId", "dbo.ProductTypes", "ProductTypeId"); 
    } 
} 
関連する問題