22

我正在创建这个模型作为我的代码优先实体框架的一部分

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

使用Update-Database -Verbose -Force包管理器控制台中的命令我在更新的这一位期间得到了这个异常Applying automatic migration: 201211252223088_AutomaticMigration.

ALTER TABLE [dbo].[NewUserRegistration] ADD [NewUserRegistrationId] [int] NOT NULL IDENTITY System.Data.SqlClient.SqlException (0x80131904):为表“NewUserRegistration”指定了多个标识列。每个表只允许一个标识列。在 System.Data.SqlClient.SqlConnection.OnError(SqlException 异常,布尔 breakConnection,操作1 wrapCloseInAction) at System.Data.SqlClient.SqlInternalConnection.OnError(SqlException exception, Boolean breakConnection, Action1 wrapCloseInAction) 在 System.Data.SqlClient.TdsParser.ThrowExceptionAndWarning(TdsParserStateObject stateObj, Boolean callerHasConnectionLock, Boolean asyncClose) 在 System.Data.SqlClient.TdsParser.TryRun(RunBehavior runBehavior, SqlCommand cmdHandler, SqlDataReader dataStream, BulkCopySimpleResultSet bulkCopyHandler, TdsParserStateObject state&Obj, Boolean dataReady) 在 System.Data.SqlClient.SqlCommand.RunExecuteNonQueryTds(String methodName, Boolean async, Int32 timeout) 在 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) 在 System.Data.Entity.Migrations.Infrastructure.MigratorBase。 ExecuteStatements(IEnumerable1 migrationStatements) at System.Data.Entity.Migrations.DbMigrator.ExecuteOperations(String migrationId, XDocument targetModel, IEnumerableSystem.Data.Entity.Migrations.DbMigrator.AutoMigrate(String migrationId, XDocument sourceModel, XDocument targetModel, Boolean downgrading) at System.Data.Entity.Migrations.Infrastructure.MigratorLoggingDecorator.AutoMigrate(String migrationId, XDocument sourceModel, XDocument targetModel, Boolean downgrading) at System.Data.Entity.Migrations.DbMigrator.Upgrade(IEnumerable 1 pendingMigrations, 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) 在 System.Data.Entity.Migrations.Infrastructure.MigratorBase.Update(String targetMigration) 在 System.Data.Entity.Migrations.Design.ToolingFacade.UpdateRunner.RunCore () 在 System.Data.Entity.Migrations.Design.ToolingFacade.BaseRunner.Run() ClientConnectionId:a39395da-5f2b-48e0-bdac-b48d75a68c68 为表“NewUserRegistration”指定了多个标识列。每个表只允许一个标识列。

显然只指定了一个身份列。那么为什么会这样呢?

当我这样做时,我没有例外。

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

关于为什么会这样的任何想法?

编辑

我应该说我正在更改密钥的名称。评论说你不能这样做。如何删除和重新创建?

最好从 SQL 中删除数据库,然后Update-Database再次运行该命令?

4

6 回答 6

85

尝试重命名键列时遇到了同样的错误。为了使迁移工作,我必须在我的脚手架迁移脚本中重新排序操作顺序。

在这里,我确保先订购 Drop 操作,然后再添加新的 Key 字段。

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,DropColumnAddColumn命令,例如AddPrimaryKeyRenameColumn

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

首先Add-Migration -Name 然后

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

第一次迁移后,我也遇到了类似的问题。我意识到,在我删除了第一次迁移创建的数据库,然后也删除了在我的 mvc 应用程序中创建的迁移文件夹后,问题没有再次出现。

于 2016-03-19T13:07:44.073 回答
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 回答