实体框架为表指定5个多重身份列。 对于每个表一个标识列允许(Entity Framework 5

2019-08-03 04:53发布

我创建这个模型,我的代码第一个实体框架的一部分

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

使用Update-Database -Verbose -Force在包管理器ConsoleI命令该位在更新的过程中得到这个异常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, Action 1个wrapCloseInAction)在System.Data.SqlClient.TdsParser .ThrowExceptionAndWarning(TdsParserStateObject stateObj,布尔callerHasConnectionLock,布尔asyncClose)在System.Data.SqlClient.TdsParser.TryRun(RunBehavior runBehavior,SqlCommand的cmdHandler,SqlDataReader的数据流,BulkCopySimpleResultSet bulkCopyHandler,TdsParserStateObject stateObj,布尔逻辑dataReady)在System.Data.SqlClient.SqlCommand。 RunExecuteNonQueryTds(字符串方法名,布尔异步,的Int32超时)在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(IEnumerable 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(IEnumerable 1个migrationStatements)在System.Data.Entity的.Migrations.Infrastructure.MigratorBase.ExecuteStatements(IEnumerable的1 migrationStatements) at System.Data.Entity.Migrations.DbMigrator.ExecuteOperations(String migrationId, XDocument targetModel, IEnumerable在System.Data.Entity.Migrations 1个操作,布尔降级,布尔自动) .DbMigrator.AutoMigrate(字符串migrationId,的XDocument sourceModel,的XDocument targetModel,布尔降级)在System.Data.Entity.Migrations.Infrastructure.MigratorLoggingDecorator.AutoMigrate(字符串migrationId,的XDocument sourceModel,的XDocument targetModel,布尔降级)在System.Data.Entity的.Migrations.DbMigrator.Upgrade(IEnumerable的1 pendingMigrations, String targetMigrationId, String lastMigrationId)
at System.Data.Entity.Migrations.Infrastructure.MigratorLoggingDecorator.Upgrade(IEnumerable
1 pendingMigrations, String targetMigrationId, String lastMigrationId)
at System.Data.Entity.Migrations.Infrastructure.MigratorLoggingDecorator.Upgrade(IEnumerable
1 pendingMigrations, String targetMigrationId, String lastMigrationId)
at System.Data.Entity.Migrations.Infrastructure.MigratorLoggingDecorator.Upgrade(IEnumerable
1个pendingMigrations,字符串targetMigrationId,字符串lastMigrationId)
在System.Data.Entity.Migrations.DbMigrator.Update(字符串targetMigration)在System.Data.Entity.Migrations.Infrastructure.MigratorBase.Update(字符串targetMigration)在System.Data.Entity.Migrations.Design.ToolingFacade.UpdateRunner.RunCore ()在System.Data.Entity.Migrations.Design.ToolingFacade.BaseRunner.Run()ClientConnectionId:表 'NewUserRegistration' 指定a39395da-5f2b-48e0-BDAC-b48d75a68c68多个标识列。 对于每个表一个标识列是允许的。

这里显然是只有一个指定的标识列。 那么,为什么是这样?

当我这样做,我得到也不例外。

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

为什么是这样的话有什么想法?

编辑

我应该说,我改变了密钥的名称。 评论说,你不能仅仅做到这一点。 我怎样才能删除并重新创建?

它是最好从SQL删除数据库,然后只需运行Update-Database再次命令?

Answer 1:

试图重命名键列,当我遇到了同样的错误。 为了使迁移工作,我不得不重新安排我的脚手架迁移脚本的操作顺序。

在这里,我就确定首先命令删除操作,那么后来加入的新的键字段。

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

希望与您的情况有所帮助。



Answer 2:

我也没有任何问题,只需更换相关DropPrimaryKeyDropColumnAddColumnAddPrimaryKey用命令RenameColumn命令,如

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


Answer 3:

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



Answer 4:

你可以直接从类使用这样的更改列的名称:

[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; }
    }
}


Answer 5:

第一Add-Migration -Name然后

public override void Up()
{    
    RenameColumn("dbo.Department", "OldId", "NewId");
}


文章来源: Entity Framework 5 Multiple identity columns specified for table. Only one identity column per table is allowed