22

コードファーストエンティティフレームワークの一部としてこのモデルを作成しています

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

Update-Database -Verbose -ForcePackage Manger Consoleでコマンドを使用すると、更新のこのビット中にこの例外が発生しますApplying automatic migration: 201211252223088_AutomaticMigration.

ALTERTABLE[dbo]。[NewUserRegistration]ADD[NewUserRegistrationId] [int] NOT NULL IDENTITY System.Data.SqlClient.SqlException(0x80131904):テーブル'NewUserRegistration'に複数のID列が指定されています。テーブルごとに1つのID列のみが許可されます。System.Data.SqlClient.SqlConnection.OnError(SqlException例外、ブール値breakConnection、アクションで1 wrapCloseInAction) at System.Data.SqlClient.SqlInternalConnection.OnError(SqlException exception, Boolean breakConnection, Action1 wrapCloseInAction)at System.Data.SqlClient.TdsParser.ThrowExceptionAndWarning(TdsParserStateObject stateObj、Boolean callerHasConnectionLock、Boolean asyncClose)at System.Data.SqlClient.TdsParser.TryRun(RunBehavior runBehavior、SqlCommand cmdHandler、SqlDataReader dataStream、Copy dataReady)at System.Data.SqlClient.SqlCommand.RunExecuteNonQueryTds(String methodName、Boolean async、Int32 timeout)at System.Data.SqlClient.SqlCommand.InternalExecuteNonQuery(TaskCompletionSource 1 completion, String methodName, Boolean sendToPipe, Int32 timeout, Boolean asyncWrite) at System.Data.SqlClient.SqlCommand.ExecuteNonQuery() at System.Data.Entity.Migrations.DbMigrator.ExecuteSql(DbTransaction transaction, MigrationStatement migrationStatement) at System.Data.Entity.Migrations.Infrastructure.MigratorLoggingDecorator.ExecuteSql(DbTransaction transaction, MigrationStatement migrationStatement) at System.Data.Entity.Migrations.DbMigrator.ExecuteStatements(IEnumerable1 migrationStatements)atSystem.Data.Entity.Migrations.Infrastructure.MigratorBase。 ExecuteStatements(IEnumerable1 migrationStatements) at System.Data.Entity.Migrations.DbMigrator.ExecuteOperations(String migrationId, XDocument targetModel, IEnumerableSystem.Data.Entity.Migrations.Infrastructure.MigratorLoggingDecorator.AutoMigrate(String)での1つの操作、ブール値のダウングレード、ブール値の自動)物質移行ID、XDocument sourceModel、XDocument targetModel、ブール値のダウングレード)at System.Data.Entity.Migrations.DbMigrator.Upgrade(IEnumerable 1 expectedMigrations、String targetMigrationId、String lastMigrationId)1 pendingMigrations, String targetMigrationId, String lastMigrationId)
at System.Data.Entity.Migrations.Infrastructure.MigratorLoggingDecorator.Upgrade(IEnumerable

System.Data.Entity.Migrations.DbMigrator.Update(String targetMigration)at System.Data.Entity.Migrations.Infrastructure.MigratorBase.Update(String targetMigration)at System.Data.Entity.Migrations.Design.ToolingFacade.UpdateRunner.RunCore ()at System.Data.Entity.Migrations.Design.ToolingFacade.BaseRunner.Run()ClientConnectionId:a39395da-5f2b-48e0-bdac-b48d75a68c68テーブル'NewUserRegistration'に複数のID列が指定されています。テーブルごとに1つのID列のみが許可されます。

明らかに、指定されたID列は1つだけです。では、なぜこれが当てはまるのでしょうか。

これを行うと、例外は発生しません。

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

なぜこれが当てはまるのかについて何か考えはありますか?

編集

キーの名前を変更していると言わなければなりません。コメントはあなたがこれをすることはできないと言っています。ドロップして再作成するにはどうすればよいですか?

Update-DatabaseSQLからデータベースを削除してから、コマンドを再実行するのが最善ですか?

4

6 に答える 6

85

キー列の名前を変更しようとしたときに同じエラーが発生しました。移行を機能させるには、スキャフォールド移行スクリプトの操作の順序を並べ替える必要がありました。

ここでは、最初にドロップ操作を注文し、その後に新しいキーフィールドを追加したことを確認しました。

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");
    }

それがあなたのケースに役立つことを願っています。

于 2013-02-04T07:15:52.620 に答える
6

DropPrimaryKeyまた、関連する、、、およびコマンドをコマンドにDropColumn置き換えるだけでも問題はありませんでした。AddColumnAddPrimaryKeyRenameColumn

public partial class RenameKey : DbMigration
{
    public override void Up()
    {    
        RenameColumn("dbo.GameSummary", "OldId", "Id");
    }
}
于 2014-03-13T16:46:37.867 に答える
2

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

于 2016-03-19T13:07:44.073 に答える
2

最初Add-Migration -Name にそれから

public override void Up()
{    
    RenameColumn("dbo.Department", "OldId", "NewId");
}
于 2018-08-20T22:41:40.870 に答える
1

次のようなものを使用して、クラスから直接列の名前を変更できます。

[Column("ProductID")]

例:

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; }
    }
}
于 2017-10-19T20:58:34.447 に答える
0

最良の実装は次のとおりです。

/*Replace*/
DropPrimaryKey("dbo.GameSummary", new[] { "OldId" });
DropColumn("dbo.GameSummary", "OldId");
AddColumn("dbo.GameSummary", "Id", c => c.Int(nullable: false, identity: true));
AddPrimaryKey("dbo.GameSummary", "Id");
/*For*/
RenameColumn("dbo.GameSummary", "OldId", "Id");
于 2020-02-28T14:50:31.287 に答える