序列包含一个以上的元素
本文关键字:元素 一个以 包含 | 更新日期: 2023-09-27 18:13:19
我今天将EF从5更新为6,我遵循了MSDN中的以下步骤:
http://msdn.microsoft.com/en-us/data/upgradeef6.aspx 现在的问题是,当我查询任何存储库时,像这样:mapEntitiesContext.ContextParameterScreens
.Where(p => p.OwningTenantId == IdentityHelper.IdPrv.TenantId)
.Select(p => new
{
p.ParameterScreenDefinitionId,
p.MedicalContextId
})
.FirstOrDefault();
我得到错误:
序列包含一个以上的元素。
我在使用EF 5.0时从未遇到过这个问题。
Stacktrace
System.InvalidOperationException: Sequence contains more than one element
Result StackTrace:
at System.Linq.Enumerable.SingleOrDefault[TSource](IEnumerable`1 source)
at System.Data.Entity.Migrations.Infrastructure.EdmModelDiffer.<>c__DisplayClass281.<IndexesEqual>b__27e(String c)
at System.Linq.Enumerable.<>c__DisplayClass12`3.<CombineSelectors>b__11(TSource x)
at System.Linq.Enumerable.WhereSelectEnumerableIterator`2.MoveNext()
at System.Linq.Enumerable.SequenceEqual[TSource](IEnumerable`1 first, IEnumerable`1 second, IEqualityComparer`1 comparer)
at System.Data.Entity.Migrations.Infrastructure.EdmModelDiffer.IndexesEqual(ConsolidatedIndex consolidatedIndex1, ConsolidatedIndex consolidatedIndex2, ICollection`1 renamedColumns)
at System.Data.Entity.Migrations.Infrastructure.EdmModelDiffer.<>c__DisplayClass272.<FindAddedIndexes>b__26e(ConsolidatedIndex i1, ConsolidatedIndex i2)
at System.Data.Entity.Utilities.DynamicEqualityComparer`1.Equals(T x, T y)
at System.Linq.Set`1.Find(TElement value, Boolean add)
at System.Linq.Set`1.Add(TElement value)
at System.Linq.Enumerable.<ExceptIterator>d__99`1.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.Internal.InternalContext.ModelMatches(VersionedModel model)
at System.Data.Entity.Internal.ModelCompatibilityChecker.CompatibleWithModel(InternalContext internalContext, ModelHashCalculator modelHashCalculator, Boolean throwIfNoMetadata, DatabaseExistenceState existenceState)
at System.Data.Entity.Internal.InternalContext.CompatibleWithModel(Boolean throwIfNoMetadata, DatabaseExistenceState existenceState)
at System.Data.Entity.Database.CompatibleWithModel(Boolean throwIfNoMetadata, DatabaseExistenceState existenceState)
at System.Data.Entity.CreateDatabaseIfNotExists`1.InitializeDatabase(TContext context)
at System.Data.Entity.Internal.InternalContext.<>c__DisplayClassf`1.<CreateInitializationAction>b__e()
at System.Data.Entity.Internal.InternalContext.PerformInitializationAction(Action action)
at System.Data.Entity.Internal.InternalContext.PerformDatabaseInitialization()
at System.Data.Entity.Internal.LazyInternalContext.<InitializeDatabase>b__4(InternalContext c)
at System.Data.Entity.Internal.RetryAction`1.PerformAction(TInput input)
at System.Data.Entity.Internal.LazyInternalContext.InitializeDatabaseAction(Action`1 action)
at System.Data.Entity.Internal.LazyInternalContext.InitializeDatabase()
at System.Data.Entity.Internal.InternalContext.Initialize()
at System.Data.Entity.Internal.InternalContext.GetEntitySetAndBaseTypeForType(Type entityType)
at System.Data.Entity.Internal.Linq.InternalSet`1.Initialize()
at System.Data.Entity.Internal.Linq.InternalSet`1.get_InternalContext()
at System.Data.Entity.Infrastructure.DbQuery`1.System.Linq.IQueryable.get_Provider()
at System.Linq.Queryable.Where[TSource](IQueryable`1 source, Expression`1 predicate)
经过大量的测试和调试,我终于找到了一个"解决方案"。
我从一个新项目开始,从'add-migration InitialCreate -verbose'开始,在EF 6.0中,这个方法创建了一个名为'InitialSchema'的新文件。
当我开始进行当前的迁移时(一年多以前),初始文件被命名为:initial。只是添加一个名为'InitialSchema'的空类修复了我的错误。
public partial class InitialSchema : DbMigration
{
public override void Up()
{
}
public override void Down()
{
}
}
当我启动应用程序并创建DbContext时,EF在这个
上崩溃了希望它也能帮助到其他人。
您发布的堆栈跟踪表明这不是您的查询问题,而是与底层实体框架基础设施有关。它尝试在对数据库做任何事情之前初始化数据库(即。您的查询),并将其现有模式与当前模式进行比较。当比较自上次在数据库上运行EF以来添加或删除列的一些表的索引时,它会失败-抛出的SingleOrDefault
是在EdmModelDiffer
的IndexesEqual
方法中。所以你可以:
- 重新创建数据库,如果它是你的开发数据库-只需删除它,EF将重新创建它想要的方式,
- 在EF中禁用自动数据库初始化(不同版本的方式不同),这样它就不会阻塞你的模型,
- 找出为什么它失败与你的模型(此刻你知道,它期望一个列有一个特定的名称,但有一个以上),并围绕它工作。