2

我今天将我的 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)
4

2 回答 2

3

经过大量的测试和调试,我终于找到了一个“解决方案”。

我从一个新项目开始,从“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 崩溃了

希望它也可以帮助其他人:)

于 2014-07-18T13:20:38.050 回答
2

您发布的堆栈跟踪表明这不是您的查询的问题,而是底层实体框架基础设施的问题。它会在对数据库进行任何操作(即您的查询)之前尝试初始化数据库,并且作为这样做的一部分,它会将其现有架构与当前架构进行比较。比较自上次在数据库上运行 EF 以来添加或删除列的某个表的索引时,它会失败 -SingleOrDefault抛出的IndexesEqual方法是EdmModelDiffer. 这样你就可以:

  • 如果它是您的开发数据库,​​则重新创建数据库 - 只需删除它,EF 就会按照它想要的方式重新创建它,
  • 在 EF 中禁用自动数据库初始化(这样做的方式因版本而异),这样它就不会阻塞您的模型,
  • 弄清楚为什么它会在您的模型中失败(目前您知道它希望单个列具有特定名称但有多个)并解决它。
于 2014-07-16T22:02:40.663 回答