C# 实体框架迁移:序列包含多个匹配元素

C# 实体框架迁移:序列包含多个匹配元素,c#,entity-framework,entity-framework-6,entity-framework-core,entity-framework-migrations,C#,Entity Framework,Entity Framework 6,Entity Framework Core,Entity Framework Migrations,我们最近对代码库进行了一次大规模重构(添加一些新实体、更新名称空间、更改导航属性等) 在重构之前,我们的代码库进行了大量实体框架迁移(运行良好) 但是,在尝试对重构的代码库运行“更新数据库”或“添加迁移”时,我们收到一个序列包含多个匹配元素异常 解决此问题的唯一方法是完全删除现有(以前工作的)迁移,并运行“添加迁移”。这显然从零开始生成了一个新的数据库模式,但迁移工作正常 是否有一种方法可以在不删除现有迁移的情况下继续前进 从以下运行“更新数据库”中查找堆栈跟踪: System.InvalidO

我们最近对代码库进行了一次大规模重构(添加一些新实体、更新名称空间、更改导航属性等)

在重构之前,我们的代码库进行了大量实体框架迁移(运行良好)

但是,在尝试对重构的代码库运行“更新数据库”或“添加迁移”时,我们收到一个
序列包含多个匹配元素
异常

解决此问题的唯一方法是完全删除现有(以前工作的)迁移,并运行“添加迁移”。这显然从零开始生成了一个新的数据库模式,但迁移工作正常

是否有一种方法可以在不删除现有迁移的情况下继续前进

从以下运行“更新数据库”中查找堆栈跟踪:

System.InvalidOperationException: Sequence contains more than one matching element
   at System.Linq.Enumerable.SingleOrDefault[TSource](IEnumerable`1 source, Func`2 predicate)
   at System.Data.Entity.Migrations.Infrastructure.EdmModelDiffer.<>c__DisplayClass24f.<FindAlteredColumns>b__246(<>f__AnonymousType2b`2 <>h__TransparentIdentifier241)
   at System.Linq.Enumerable.WhereSelectEnumerableIterator`2.MoveNext()
   at System.Linq.Enumerable.WhereSelectEnumerableIterator`2.MoveNext()
   at System.Collections.Generic.List`1..ctor(IEnumerable`1 collection)
   at System.Linq.Enumerable.ToList[TSource](IEnumerable`1 source)
   at System.Data.Entity.Migrations.Infrastructure.EdmModelDiffer.Diff(ModelMetadata source, ModelMetadata target, Lazy`1 modificationCommandTreeGenerator, MigrationSqlGenerator migrationSqlGenerator, String sourceModelVersion, String targetModelVersion)
   at System.Data.Entity.Migrations.Infrastructure.EdmModelDiffer.Diff(XDocument sourceModel, XDocument targetModel, Lazy`1 modificationCommandTreeGenerator, MigrationSqlGenerator migrationSqlGenerator, String sourceModelVersion, String targetModelVersion)
   at System.Data.Entity.Migrations.DbMigrator.IsModelOutOfDate(XDocument model, DbMigration lastMigration)
   at 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.DbMigrator.UpdateInternal(String targetMigration)
   at System.Data.Entity.Migrations.DbMigrator.<>c__DisplayClassc.<Update>b__b()
   at System.Data.Entity.Migrations.DbMigrator.EnsureDatabaseExists(Action mustSucceedToKeepDatabase)
   at System.Data.Entity.Migrations.Infrastructure.MigratorBase.EnsureDatabaseExists(Action mustSucceedToKeepDatabase)
   at System.Data.Entity.Migrations.DbMigrator.Update(String targetMigration)
   at System.Data.Entity.Migrations.Infrastructure.MigratorBase.Update(String targetMigration)
   at System.Data.Entity.Migrations.Design.ToolingFacade.UpdateRunner.Run()
   at System.AppDomain.DoCallBack(CrossAppDomainDelegate callBackDelegate)
   at System.AppDomain.DoCallBack(CrossAppDomainDelegate callBackDelegate)
   at System.Data.Entity.Migrations.Design.ToolingFacade.Run(BaseRunner runner)
   at System.Data.Entity.Migrations.Design.ToolingFacade.Update(String targetMigration, Boolean force)
   at System.Data.Entity.Migrations.UpdateDatabaseCommand.<>c__DisplayClass2.<.ctor>b__0()
   at System.Data.Entity.Migrations.MigrationsDomainCommand.Execute(Action command)
Sequence contains more than one matching element
System.InvalidOperationException:序列包含多个匹配元素
在System.Linq.Enumerable.SingleOrDefault[TSource](IEnumerable`1源,Func`2谓词)
位于System.Data.Entity.Migrations.Infrastructure.EdmModelDifference.c__DisplayClass24f.b__246(f__匿名类型2B`2 h__透明标识符241)
在System.Linq.Enumerable.WhereSelectEnumerableInterator`2.MoveNext()中
在System.Linq.Enumerable.WhereSelectEnumerableInterator`2.MoveNext()中
位于System.Collections.Generic.List`1..ctor(IEnumerable`1集合)
at System.Linq.Enumerable.ToList[TSource](IEnumerable`1 source)
位于System.Data.Entity.Migrations.Infrastructure.EdmModelDifference.Diff(ModelMetadata源、ModelMetadata目标、Lazy`1 modificationCommandTreeGenerator、MigrationSqlGenerator MigrationSqlGenerator、String sourceModelVersion、String targetModelVersion)
位于System.Data.Entity.Migrations.Infrastructure.EdmModelDifferent.Diff(XDocument sourceModel,XDocument targetModel,Lazy`1 modificationCommandTreeGenerator,MigrationSqlGenerator MigrationSqlGenerator,String sourceModelVersion,String targetModelVersion)
位于System.Data.Entity.Migrations.DbMigrator.isModelOutdate(XDocument model,DbMigration lastMigration)
位于System.Data.Entity.Migrations.DbMigrator.Upgrade(IEnumerable`1 pendingMigrations,String targetMigrationId,String lastMigrationId)
位于System.Data.Entity.Migrations.Infrastructure.MigratorLoggingDecorator.Upgrade(IEnumerable`1 pendingMigrations,字符串targetMigrationId,字符串lastMigrationId)
位于System.Data.Entity.Migrations.Dbmigator.UpdateInternal(字符串targetMigration)
在System.Data.Entity.Migrations.DbMigrator.c__DisplayClassc.b__b()中
位于System.Data.Entity.Migrations.Dbmigator.EnsureDatabaseExists(操作必须成功才能访问数据库)
位于System.Data.Entity.Migrations.Infrastructure.MigratorBase.EnsureDatabaseExists(操作必须成功才能使用数据库)
位于System.Data.Entity.Migrations.DbMigrator.Update(字符串targetMigration)
位于System.Data.Entity.Migrations.Infrastructure.MigratorBase.Update(字符串targetMigration)
在System.Data.Entity.Migrations.Design.ToolingFacade.UpdateRunner.Run()中
在System.AppDomain.DoCallBack(CrossAppDomainDelegate callBackDelegate)处
在System.AppDomain.DoCallBack(CrossAppDomainDelegate callBackDelegate)处
位于System.Data.Entity.Migrations.Design.ToolingFacade.Run(BaseRunner)
位于System.Data.Entity.Migrations.Design.ToolingFacade.Update(字符串targetMigration,布尔力)
在System.Data.Entity.Migrations.UpdateDatabaseCommand.c__DisplayClass2.b__0()中
位于System.Data.Entity.Migrations.MigrationsDomainCommand.Execute(操作命令)
序列包含多个匹配元素

编辑:我现在已尝试禁用所有seed data语句,但问题仍然存在。。这里还发现了一个相关的问题:(虽然没有给出解决方案)。

经过多次尝试,我发现了同样的问题。该问题是由于两个类共享相同的
名称
,但不同的
命名空间
;不知何故,EF忽略了名称空间,在更改类名后发生了错误。错误消失。

如果EF被相同的名称属性所混淆,则可能会出现此问题,例如:

public int Username { get; set; }

public int UserName { get; set; }

可能会触发此错误

SingleOrDefault
在数据库中只能有一个元素。如果返回2,则抛出异常。是的,但我们的迁移实际上都没有使用“SingleOrDefault”。我认为它是由实体框架本身调用的?您是否使用
ColumnAttribute
(例如
[Column(TypeName=“VARCHAR(50)”)]
?如何执行
添加迁移
命令(也包括迁移名称)?不,我们只是将其保留为实体框架默认值…当我们运行“更新数据库”时也会发生相同的异常..因此我认为这与我们实际运行命令的方式无关..您的问题与此类似吗:?您的表是否具有独立关联?通常这与模型生成或
DbMigration
有关,请在
Migrations
目录中显示扩展了
DbMigration
的模型和迁移代码。从堆栈跟踪来看,这看起来像是违规代码;我发现EF核心团队对错误报告反应相当迅速,特别是当我可以跟踪到pr时问题代码.net核心代码库将变成.net 5,因此值得在那里引发bug。很抱歉,我没有仔细检查该代码。遗漏了大写字母N。用户名可能不是int类型,但这与此无关