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

时间:2017-04-28 08:29:05

标签: c# entity-framework entity-framework-6 entity-framework-core ef-migrations

我们最近在代码库上做了一个大型重构(添加一些新实体,更新名称空间,更改导航属性等)。

我们在重构之前的代码库有许多实体框架迁移(工作正常)。

但是,在尝试在重构的代码库上运行“update-database”或“add-migration”时,我们收到Sequence contains more than one matching element例外。

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

有没有办法在不删除现有迁移的情况下继续前进?

从下面运行'update-database'中找到堆栈跟踪:

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

编辑:我现在尝试禁用所有种子数据语句,问题仍然存在。此处也发现了一个相关问题:http://entityframework.codeplex.com/workitem/569(虽然没有给出解决方案)。

2 个答案:

答案 0 :(得分:0)

在遭受重创之后,我遇到了同样的问题,我发现了问题。该问题是由于两个类共享相同的name但不同的namespace引起的; EF以某种方式忽略了名称空间,并且在更改类名称后发生了错误,该错误消失了。

答案 1 :(得分:0)

例如,如果EF的同名属性引起混淆,则可能会出现此问题:

public int Username { get; set; }

public int UserName { get; set; }

可能会触发此错误。

相关问题