无法创建多个 ID,但我只有一个

Posted

技术标签:

【中文标题】无法创建多个 ID,但我只有一个【英文标题】:Cannot create Multiple Ids but yet I only have one 【发布时间】:2018-10-06 21:59:15 【问题描述】:

如您所见,我正在使用一个主键创建一个新类,我删除了数据库以重新创建它,但是

public class CustomerContracts

    [Key, Column("ItemId")]  //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 ItemId  get; set; 

    public string Description  get; set; 

    public string CustomerRef  get; set; 


    public int ContractTypeId  get; set; 

    public DateTime StartDate  get; set; 

    public DateTime EndDate  get; set; 

    public bool isActive  get; set; 
    [DecimalPrecision(18, 2)]
    public decimal Price  get; set; 


但是当我尝试更新数据库时收到以下错误。

指定“-Verbose”标志以查看应用于目标数据库的 SQL 语句。 应用显式迁移:[201804260855058_firstmigration]。 应用显式迁移:201804260855058_firstmigration。 System.Data.SqlClient.SqlException (0x80131904):为表“CustomerContracts”指定了多个标识列。每个表只允许一个标识列。 在 System.Data.SqlClient.SqlConnection.OnError(SqlException 异常,布尔 breakConnection,Action1 wrapCloseInAction) at System.Data.SqlClient.SqlInternalConnection.OnError(SqlException exception, Boolean breakConnection, Action1 wrapCloseInAction) 在 System.Data.SqlClient.TdsParser.ThrowExceptionAndWarning(TdsParserStateObject stateObj,布尔调用者HasConnectionLock,布尔异步关闭) 在 System.Data.SqlClient.TdsParser.TryRun(RunBehavior runBehavior,SqlCommand cmdHandler,SqlDataReader dataStream,BulkCopySimpleResultSet bulkCopyHandler,TdsParserStateObject stateObj,Boolean & dataReady) 在 System.Data.SqlClient.SqlCommand.RunExecuteNonQueryTds(字符串方法名,布尔异步,Int32 超时,布尔异步写入) 在 System.Data.SqlClient.SqlCommand.InternalExecuteNonQuery(TaskCompletionSource1 completion, String methodName, Boolean sendToPipe, Int32 timeout, Boolean& usedCache, Boolean asyncWrite, Boolean inRetry) at System.Data.SqlClient.SqlCommand.ExecuteNonQuery() at System.Data.Entity.Infrastructure.Interception.DbCommandDispatcher.<NonQuery>b__0(DbCommand t, DbCommandInterceptionContext1 c) 在 System.Data.Entity.Infrastructure.Interception.InternalDispatcher1.Dispatch[TTarget,TInterceptionContext,TResult](TTarget target, Func3 操作,TInterceptionContext 拦截上下文,Action3 executing, Action3 执行) 在 System.Data.Entity.Infrastructure.Interception.DbCommandDispatcher.NonQuery(DbCommand 命令,DbCommandInterceptionContext 拦截上下文) 在 System.Data.Entity.Internal.InterceptableDbCommand.ExecuteNonQuery() 在 System.Data.Entity.Migrations.DbMigrator.ExecuteSql(MigrationStatement migrationStatement,DbConnection 连接,DbTransaction 事务,DbInterceptionContext 拦截上下文) 在 System.Data.Entity.Migrations.Infrastructure.MigratorLoggingDecorator.ExecuteSql(MigrationStatement migrationStatement,DbConnection 连接,DbTransaction 事务,DbInterceptionContext 拦截上下文) 在 System.Data.Entity.Migrations.DbMigrator.ExecuteStatementsInternal(IEnumerable1 migrationStatements, DbConnection connection, DbTransaction transaction, DbInterceptionContext interceptionContext) at System.Data.Entity.Migrations.DbMigrator.ExecuteStatementsWithinTransaction(IEnumerable1 迁移语句,DbTransaction 事务,DbInterceptionContext 拦截上下文) 在 System.Data.Entity.Migrations.DbMigrator.ExecuteStatementsWithinNewTransaction(IEnumerable1 migrationStatements, DbConnection connection, DbInterceptionContext interceptionContext) at System.Data.Entity.Migrations.DbMigrator.ExecuteStatementsInternal(IEnumerable1 migrationStatements,DbConnection 连接,DbInterceptionContext 拦截上下文) 在 System.Data.Entity.Migrations.DbMigrator.ExecuteStatementsInternal(IEnumerable1 migrationStatements, DbConnection connection) at System.Data.Entity.Migrations.DbMigrator.<>c__DisplayClass32.<ExecuteStatements>b__30() at System.Data.Entity.SqlServer.DefaultSqlExecutionStrategy.<>c__DisplayClass1.<Execute>b__0() at System.Data.Entity.SqlServer.DefaultSqlExecutionStrategy.Execute[TResult](Func1 操作) 在 System.Data.Entity.SqlServer.DefaultSqlExecutionStrategy.Execute(操作操作) 在 System.Data.Entity.Migrations.DbMigrator.ExecuteStatements(IEnumerable1 migrationStatements, DbTransaction existingTransaction) 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, VersionedModel targetModel, IEnumerable1 操作,IEnumerable1 systemOperations, Boolean downgrading, Boolean auto) at System.Data.Entity.Migrations.DbMigrator.ApplyMigration(DbMigration migration, DbMigration lastMigration) at System.Data.Entity.Migrations.Infrastructure.MigratorLoggingDecorator.ApplyMigration(DbMigration migration, DbMigration lastMigration) at System.Data.Entity.Migrations.DbMigrator.Upgrade(IEnumerable1 挂起迁移,字符串 targetMigrationId,字符串 lastMigrationId) 在 System.Data.Entity.Migrations.Infrastructure.MigratorLoggingDecorator.Upgrade(IEnumerable`1 pendingMigrations,字符串 targetMigrationId,字符串 lastMigrationId) 在 System.Data.Entity.Migrations.DbMigrator.UpdateInternal(字符串 targetMigration) 在 System.Data.Entity.Migrations.DbMigrator.c__DisplayClasse.b__d() 在 System.Data.Entity.Migrations.DbMigrator.EnsureDatabaseExists(操作 mustSucceedToKeepDatabase) 在 System.Data.Entity.Migrations.Infrastructure.MigratorBase.EnsureDatabaseExists(操作 mustSucceedToKeepDatabase) 在 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:8aa18649-614e-4be4-a46d-fb780984d59f 错误号:2744,状态:2,类:16 为表“CustomerContracts”指定了多个标识列。每个表只允许一个标识列。

为什么我会收到此错误。如您所见,我只使用一个键,也没有重命名它(这是一个新表,因为我删除了数据库)。任何帮助将不胜感激。

这是我的迁移,我在删除数据库后删除了文件夹,但它仍在上下移动信息。

 public partial class firstmigration : DbMigration
    
        public override void Up()
        
            DropPrimaryKey("dbo.CustomerContracts");
            AddColumn("dbo.CustomerContracts", "ItemId", c => c.Int(nullable: false, identity: true));
            AddPrimaryKey("dbo.CustomerContracts", "ItemId");
            DropColumn("dbo.CustomerContracts", "TeamId");
        

        public override void Down()
        
            AddColumn("dbo.CustomerContracts", "TeamId", c => c.Int(nullable: false, identity: true));
            DropPrimaryKey("dbo.CustomerContracts");
            DropColumn("dbo.CustomerContracts", "ItemId");
            AddPrimaryKey("dbo.CustomerContracts", "TeamId");
        
    

【问题讨论】:

你能发布你的迁移吗? 请看我的编辑 【参考方案1】:

试试这个:

public override void Up()

    DropPrimaryKey("dbo.CustomerContracts");
    DropColumn("dbo.CustomerContracts", "TeamId"); // Drop this first
    AddColumn("dbo.CustomerContracts", "ItemId", c => c.Int(nullable: false, identity: true));
    AddPrimaryKey("dbo.CustomerContracts", "ItemId");

【讨论】:

虽然我不明白我删除了数据库并删除了 myu 迁移,但为什么它会跟踪这一点 这似乎有效,但为什么我必须手动更改 看起来 EF 在删除前一个 ID 之前尝试添加新 ID。 我想念 edmx 是否有办法使用 ef6 像以前一样自动生成类? 不是你要找的,但是:marketplace.visualstudio.com/…

以上是关于无法创建多个 ID,但我只有一个的主要内容,如果未能解决你的问题,请参考以下文章

片段中的按钮自定义视图

Hadoop DistributedCache 无法报告状态

尽管尝试了多个建议,但无法在 Python 中导入本地模块

无法从多个表中删除

似乎无法使用动态生成的元素ID

Symfony - 使用学说获取最后一个 ID