实体框架5为表指定的多个标识列.每个表只允许一个标识列

Pet*_*ter 19 c#-4.0 entity-framework-5

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

public class NewUserRegistration
{
    [Key]
    public int NewUserRegistrationId { get; set; }    
}
Run Code Online (Sandbox Code Playgroud)

使用Update-Database -Verbose -ForcePackage Manger Console中的命令在此更新过程中会出现此异常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异常,Boolean breakConnection,Action1 wrapCloseInAction) at System.Data.SqlClient.SqlInternalConnection.OnError(SqlException exception, Boolean breakConnection, Action在System.Data.SqlClient.TdsParser.ThrowExceptionAndWarning(TdsParserStateObject stateObj,布尔callerHasConnectionLock,布尔asyncClose)的System.Data.SqlClient.TdsParser.TryRun(RunBehavior runBehavior,SqlCommand cmdHandler,SqlDataReader dataStream,BulkCopySimpleResultSet bulkCopyHandler,TdsParserStateObject stateObj,Boolean&)中的1 wrapCloseInAction) dataReady)在System.Data.SqlClient.SqlCommand.RunExecuteNonQueryTds(String methodName,Boolean async,Int32 timeout),System.Data.SqlClmand.SmandCommand.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(IEnumerable的1 migrationStatements) at System.Data.Entity.Migrations.DbMigrator.ExecuteOperations(String migrationId, XDocument targetModel, IEnumerableSystem.Data.Entity.Migrations.Infrastructure.MigratorLoggingDecorator.AutoMigrate(String)中System.Data.Entity.Migrations.DbMigrator.AutoMigrate(String migrationId,XDocument sourceModel,XDocument targetModel,Boolean降级)的1个操作,布尔降级,布尔自动) System.Data.Entity.Migrations.DbMigrator.Upgrade中的migrationId,XDocument sourceModel,XDocument targetModel,Boolean降级)(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.Migrations.Migrations.Migrations.ToolingFacade.UpdateRunner.RunCore上的System.Data.Entity.Migrations.Infrastructure.MigratorBase.Update(String targetMigration)中的System.Data.Entity.Migrations.DbMigrator.Update(String targetMigration)处()at System.Data.Entity.Migrations.Design.ToolingFacade.BaseRunner.Run()ClientConnectionId:a39395da-5f2b-48e0-bdac-b48d75a68c68为表'NewUserRegistration'指定的多个标识列.每个表只允许一个标识列.

显然只指定了一个标识列.那么为什么会这样呢?

当我这样做时,我也不例外.

public class NewUserRegistration
{
    [Key]
    public int Id { get; set; }    
}
Run Code Online (Sandbox Code Playgroud)

有关为什么会这样的想法?

编辑

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

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

小智 74

尝试重命名Key列时遇到了同样的错误.为了使迁移工作,我不得不重新排序我的脚手架迁移脚本中的操作顺序.

在这里,我确保首先订购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");
    }
Run Code Online (Sandbox Code Playgroud)

希望对您的案例有所帮助.

  • 有人可能认为DropPrimaryKey就足够了.重新排序代码时,请确保在AddColumn之前使用包含identity:true的ColumnBuilder类型方法发生DropPrimaryKey和DropColumn. (6认同)

ADB*_*ley 5

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

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