2012-11-25 1 views
13

許可されて私はUpdate-Database -Verbose -Forceコマンドを使用して私のコード第1エンティティフレームワークEntity Framework 5テーブルに複数のID列が指定されています。テーブルごとに1つだけID列が

public class NewUserRegistration 
{ 
    [Key] 
    public int NewUserRegistrationId { get; set; }  
} 

の一環として、このモデルを作成しておりますパッケージマネージャConsoleIでの更新のこのビットの間に、この例外を取得Applying automatic migration: 201211252223088_AutomaticMigration.

ALTER TABLE [DBO] [NewUserRegistration] ADD [NewUserRegistrationId] [INT] NOT NULL IDENTITY System.Data.SqlClient.SqlException (0x80131904):表に指定された複数のID列'NewUserRegistration'。表ごとに1つのID列のみが許可されます。 システムで System.Data.SqlClient.TdsParser.ThrowExceptionAndWarningでSystem.Data.SqlClient.SqlConnection.OnError(SQLException例外、 ブールbreakConnection、アクション1 wrapCloseInAction) at System.Data.SqlClient.SqlInternalConnection.OnError(SqlException exception, Boolean breakConnection, Action 1 wrapCloseInAction)(TdsParserStateObject stateObj、ブールcallerHasConnectionLock、ブールasyncClose)で 。 Data.SqlClient.TdsParser.TryRun(runBehavior runBehavior、 SqlCommandオブジェクトcmdHandler、SqlDataReaderのデータストリーム、 BulkCopySimpleResultSet bulkCopyHandler、TdsParserStateObject stateObj、ブール& DATAREADY) System.Data.SqlClient.SqlCommand.RunExecuteNonQueryTdsで(文字列 methodNameの、ブール非同期、のInt32タイムアウト): S System.DataでSystem.Data.Entity.Migrations.Infrastructure.MigratorBase.ExecuteStatements(IEnumerableを1 migrationStatements) at System.Data.Entity.Migrations.DbMigrator.ExecuteOperations(String migrationId, XDocument targetModel, IEnumerable 1つの操作、ブール 格下げ、ブールオート)でystem.Data.SqlClient.SqlCommand.InternalExecuteNonQuery(TaskCompletionSource migrationStatements)。 System.Data.Entity.Migrations.Infrastructure.MigratorLoggingDecorator.AutoMigrate(文字列 migrationId、XDocument sourceModel、XDocument targetModel、ブール でEntity.Migrations.DbMigrator.AutoMigrate(文字列 migrationId、XDocument sourceModel、XDocument targetModel、ブール 格下げ)ダウングレード)で System.Data.Entity.Migrations.DbMigrator.Upgrade(IEnumerable System.Data.Entity.Migrations.Infrastructure.MigratorBase.Update(文字列 targetMigration)でSystem.Data.Entity.Migrations.DbMigrator.Update(文字列 targetMigration)でpendingMigrations、文字targetMigrationId、列lastMigrationId)
でSystem.Data.Entity.Migrations.Design.ToolingFacade.BaseRunner.RunでSystem.Data.Entity.Migrations.Design.ToolingFacade.UpdateRunner.RunCore() () ClientConnectionId:a39395da-5f2b-48e0-BDAC-b48d75a68c68テーブル「NewUserRegistration」に対して複数の 識別列が指定されています。 1つのテーブルにつき1つの 識別列のみが許可されます。

明示的に1つのID列が指定されています。それでなぜこれが当てはまるのですか?

これを行うと例外はありません。

public class NewUserRegistration 
{ 
    [Key] 
    public int Id { get; set; }  
} 

なぜこのような考えがありますか?

EDIT

私は、キーの名前を変更していますと言う必要があります。コメントは、あなたがこれを行うことはできないと言います。どうすれば落として再作成できますか?

データベースをSQLから削除してから、Update-Databaseコマンドをもう一度実行するのが最善でしょうか?

+1

が見えます。 'NewUserRegistrationId'を追加する前にエンティティに他のキーを持っていましたか?アイデンティティ列は単に変更することはできません。 –

+0

はい、テーブルを削除して再作成するように指示するにはどうすればいいですか? – Peter

答えて

62

キー列の名前を変更しようとしたときに同じエラーが発生しました。マイグレーションの作業をするために、私はスキャフォールドされたマイグレーション・スクリプトで操作の順序を並べ替える必要がありました。

ここでは、まずドロップ操作を順序付けしてから、後で新しいキーフィールドを追加しました。

public partial class RenameKey : DbMigration 
{ 
    public override void Up() 
    { 
     DropPrimaryKey("dbo.GameSummary", new[] { "OldId" }); 
     DropColumn("dbo.GameSummary", "OldId"); 
     AddColumn("dbo.GameSummary", "Id", c => c.Int(nullable: false, identity: true)); 
     AddPrimaryKey("dbo.GameSummary", "Id"); 
    } 

希望はあなたのケースに役立ちます。

+5

DropPrimaryKeyで十分だと思うかもしれません。コードの順序を変更するときは、ColumnBuilder型のメソッドであるAddColumnの前に、identity:trueを含むDropPrimaryKeyとDropColumnの両方が発生していることを確認してください。 –

+0

しかし、これはOldId列の既存のデータとは正しく機能しませんか? – Elisabeth

+0

はいそれは既存のデータでは機能しません –

5

私は単に、例えば、RenameColumnコマンドを使用して、関連するDropPrimaryKeyDropColumnAddColumnAddPrimaryKeyコマンドを置き換える問題ありませんでした

public partial class RenameKey : DbMigration 
{ 
    public override void Up() 
    {  
     RenameColumn("dbo.GameSummary", "OldId", "Id"); 
    } 
} 
+0

偉大な答え。既存のデータを処理するうまい方法かもしれません。 – Irwin

2

私は最初の移行後も同様の問題がありました。私が気付いたのは、最初の移行が作成したデータベースを削除した後、自分のmvcアプリケーションで作成された移行フォルダも削除した後に問題が再現されなかったことです。

[Column("ProductID")] 

例:あなたはちょうどこのようなものを使用して、クラスから直接、列の名前を変更することができます

1

既存のテーブルを変更しているよう

namespace Z_Market.Models 
{ 
    public class Product 
    { 
     [Key, Column("ProductID")] //This change the name of the column when you are using migration. If you have a form created already, you have to change the connection in the for to aim the new column name. 
     public int ID { get; set; } 
     public string Description { get; set; } 
     public decimal Price { get; set; } 
     public DateTime LastBuy { get; set; } 
     public float Stock { get; set; } 
     public string remarks { get; set; } 
     public string deleteme { get; set; } 

     public ICollection<SupplierProduct> SupplierProducts { get; set; } 
    } 
} 
+0

EF5またはEF6の回答ですか? – Peter

関連する問題