首页 > 解决方案 > EF 6 Code First 中的更新数据库错误

问题描述

我无法自己处理这种情况,也无法在网上找到解决方案,所以我在那里问,希望有人遇到过这个问题。我有一个一年多的项目,这周我开始把所有东西都放在那里,因为上下文类的代码不可读。我不知道这是否是我的问题的开始,但在那之后(以及数据库代码的更新)我无法创建新的迁移,我试图继续更新 -数据库命令,如果我回去一切都很好,但如果我继续它工作但给我这个错误:

PM> Update-Database -TargetMigration:Profili
Specify the '-Verbose' flag to view the SQL statements being applied to the target database.
Applying explicit migrations: [202002031249206_Profili].
Applying explicit migration: 202002031249206_Profili.
System.InvalidOperationException: La sequenza contiene più elementi corrispondenti
   in System.Linq.Enumerable.SingleOrDefault[TSource](IEnumerable`1 source, Func`2 predicate)
   in System.Data.Entity.Migrations.Infrastructure.EdmModelDiffer.<>c__DisplayClass260.<FindAlteredColumns>b__257(<>f__AnonymousType2d`2 <>h__TransparentIdentifier252)
   in System.Linq.Enumerable.WhereSelectEnumerableIterator`2.MoveNext()
   in System.Linq.Enumerable.WhereSelectEnumerableIterator`2.MoveNext()
   in System.Collections.Generic.List`1..ctor(IEnumerable`1 collection)
   in System.Linq.Enumerable.ToList[TSource](IEnumerable`1 source)
   in System.Data.Entity.Migrations.Infrastructure.EdmModelDiffer.Diff(ModelMetadata source, ModelMetadata target, Lazy`1 modificationCommandTreeGenerator, MigrationSqlGenerator migrationSqlGenerator, String sourceModelVersion, String targetModelVersion)
   in System.Data.Entity.Migrations.Infrastructure.EdmModelDiffer.Diff(XDocument sourceModel, XDocument targetModel, Lazy`1 modificationCommandTreeGenerator, MigrationSqlGenerator migrationSqlGenerator, String sourceModelVersion, String targetModelVersion)
   in System.Data.Entity.Migrations.DbMigrator.IsModelOutOfDate(XDocument model, DbMigration lastMigration)
   in System.Data.Entity.Migrations.DbMigrator.Upgrade(IEnumerable`1 pendingMigrations, String targetMigrationId, String lastMigrationId)
   in System.Data.Entity.Migrations.Infrastructure.MigratorLoggingDecorator.Upgrade(IEnumerable`1 pendingMigrations, String targetMigrationId, String lastMigrationId)
   in System.Data.Entity.Migrations.DbMigrator.UpdateInternal(String targetMigration)
   in System.Data.Entity.Migrations.DbMigrator.<>c__DisplayClasse.<Update>b__d()
   in System.Data.Entity.Migrations.DbMigrator.EnsureDatabaseExists(Action mustSucceedToKeepDatabase)
   in System.Data.Entity.Migrations.Infrastructure.MigratorBase.EnsureDatabaseExists(Action mustSucceedToKeepDatabase)
   in System.Data.Entity.Migrations.DbMigrator.Update(String targetMigration)
   in System.Data.Entity.Migrations.Infrastructure.MigratorBase.Update(String targetMigration)
   in System.Data.Entity.Migrations.Design.ToolingFacade.UpdateRunner.RunCore()
   in System.Data.Entity.Migrations.Design.ToolingFacade.BaseRunner.Run()
La sequenza contiene più elementi corrispondenti
PM> 

我试图在一个新的空数据库上一次应用一个迁移,同样的错误,在一年前创建的迁移上,试图消除第一个出现此错误的迁移,因为它创建了一个我不使用的表,我已经删除了这个但仍然在下一个上给出了这个错误,所以我试图删除最后一个不会给出错误的,它改变了 2 列,无事可做,当我继续时,同样的错误。

在他完成更新后,它似乎做了一个 SingleOrDefault,但我不知道他做了什么。在 Add-Migration 命令之前调用了相同的函数,因此不会创建迁移。

我可以尝试什么?

编辑:@Donal 这是给我这个问题的第一个迁移的代码:

namespace EF_Produser.Migrations
{
    using System;
    using System.Data.Entity.Migrations;
    
    public partial class Profili : DbMigration
    {
        public override void Up()
        {
            AddColumn("PRODUSER.SYS_ABPRF_PROFILI", "ABPRF_FL_LINGUA", c => c.Int());
            AddColumn("PRODUSER.SYS_ABPRF_PROFILI", "ABPRF_LINGUA_UI", c => c.String(nullable: false, maxLength: 25));
            AddColumn("PRODUSER.SYS_ABPRF_PROFILI", "ABPRF_LINGUA_CONT", c => c.String(nullable: false, maxLength: 25));
            AddColumn("PRODUSER.SYS_ABPRF_PROFILI", "ABPRF_FL_CATART", c => c.Int());
            AddColumn("PRODUSER.SYS_ABPRF_PROFILI", "ABPRF_FL_ANAG", c => c.Int());
        }
        
        public override void Down()
        {
            DropColumn("PRODUSER.SYS_ABPRF_PROFILI", "ABPRF_FL_ANAG");
            DropColumn("PRODUSER.SYS_ABPRF_PROFILI", "ABPRF_FL_CATART");
            DropColumn("PRODUSER.SYS_ABPRF_PROFILI", "ABPRF_LINGUA_CONT");
            DropColumn("PRODUSER.SYS_ABPRF_PROFILI", "ABPRF_LINGUA_UI");
            DropColumn("PRODUSER.SYS_ABPRF_PROFILI", "ABPRF_FL_LINGUA");
        }
    }
}

没什么奇怪的,不是吗?对于唯一键...每个文件都以时间戳开头,如果是这样就可以了。

标签: c#entity-frameworklinq

解决方案


推荐阅读