EF 6.1 Последовательность Содержит более одного элемента

Я обновил свой 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)

person iBoonZ    schedule 16.07.2014    source источник
comment
Каждый запрос :) Например: mapEntitiesContext.ContextParameterScreens.Where(p => p.OwningTenantId == IdentityHelper.IdPrv.TenantId). Select(p =› new { p.ParameterScreenDefinitionId, p.MedicalContextId }).FirstOrDefault()   -  person iBoonZ    schedule 17.07.2014
comment
вы можете принять свой собственный ответ. Пожалуйста, сделайте это.   -  person Sampath    schedule 30.08.2016


Ответы (2)


После долгих испытаний и отладки я наконец нашел «решение».

Я начал с нового проекта и начал с «добавить-миграцию InitialCreate -verbose», а с EF 6.0 этот метод создает новый файл с именем: «InitialSchema».

Когда я начал свои текущие миграции (более года назад), исходный файл назывался: Initial. Просто добавление пустого класса с именем «InitialSchema» исправило мою ошибку.

public partial class InitialSchema : DbMigration
{
    public override void Up()
    {
    }

    public override void Down()
    {
    }
}

Когда я запустил свое приложение и создал свой DbContext, EF зависал на этом

Надеюсь, это поможет и другим людям :)

person iBoonZ    schedule 18.07.2014

Опубликованная вами трассировка стека указывает на то, что проблема связана не с вашим запросом, а с базовой инфраструктурой Entity Framework. Он пытается инициализировать базу данных, прежде чем что-либо с ней делать (например, ваш запрос), и в рамках этого сравнивает существующую схему с текущей. Сбой при сравнении индексов для какой-либо таблицы, из которой вы добавили или удалили столбцы с момента последнего запуска EF в базе данных — SingleOrDefault, который выдает, находится в методе IndexesEqual EdmModelDiffer. Так что вы можете:

  • воссоздайте базу данных, если это ваша база данных для разработки — просто удалите ее, и EF воссоздаст ее так, как хочет,
  • отключить автоматическую инициализацию базы данных в EF (способ сделать это зависит от версии), чтобы он не захлебывался вашей моделью,
  • выясните, почему это не работает с вашей моделью (на данный момент вы знаете, что она ожидает, что один столбец будет иметь определенное имя, но их больше одного) и обойти это.
person cynic    schedule 16.07.2014
comment
Пробовал пересоздавать базу. К сожалению, ошибка сохраняется. Я использую ручную миграцию. - person pizycki; 22.06.2017