【问题标题】:An item with the same key has already been added error in ASP.NET MVC 5在 ASP.NET MVC 5 中已添加具有相同键的项目错误
【发布时间】:2020-06-03 08:09:24
【问题描述】:

我正在将 ASP.NET MVC 3 项目升级到 MVC 5 (VS 2017),并且我有以下代码行

 IEnumerable<Country> countrydata = _db.Country.OrderBy(s => s.CountryName).ToList();

这行代码在 MVC 3 中运行良好(在 .NET 4 项目中),但在针对 .NET 4.6.1 的 MVC 5 项目中抛出以下错误,有人知道为什么吗?

已添加具有相同密钥的项目

更新: 经过进一步测试,似乎所有此类对数据库的调用在 MVC 5 / Entity Framework 6 中都会失败,因为即使下面的行也会失败并显示相同的错误消息。

IEnumerable<AuthenticationType> authenticationProvider = _db.AuthenticationType.OrderBy(n => uthenticationProvider).ToList();

@Christos,请参阅我在下面提到的 .edmx 设计器消息

下面是堆栈跟踪

在 System.ThrowHelper.ThrowArgumentException(ExceptionResource 资源)在 System.Collections.Generic.Dictionary2.Insert(TKey key, TValue value, Boolean add) at System.Data.Metadata.Edm.ObjectItemAttributeAssemblyLoader.LoadRelationshipTypes() at System.Data.Metadata.Edm.ObjectItemAttributeAssemblyLoader.LoadTypesFromAssembly() at System.Data.Metadata.Edm.ObjectItemAssemblyLoader.Load() at System.Data.Metadata.Edm.ObjectItemAttributeAssemblyLoader.Load() at System.Data.Metadata.Edm.AssemblyCache.LoadAssembly(Assembly assembly, Boolean loadReferencedAssemblies, ObjectItemLoadingSessionData loadingData) at System.Data.Metadata.Edm.AssemblyCache.LoadAssembly(Assembly assembly, Boolean loadReferencedAssemblies, KnownAssembliesSet knownAssemblies, EdmItemCollection edmItemCollection, Action1 logLoadMessage,Object& loaderCookie,Dictionary2&amp; typesInLoading, List1& 错误)在 System.Data.Metadata.Edm.ObjectItemCollection.LoadAssemblyFromCache( System.Data.Metadata.Edm.ObjectItemCollection.ImplicitLoadAssemblyForType(类型类型,EdmItemCollection edmItemCollection)在 System.Data.Metadata.Edm.MetadataWorkspace.ImplicitLoadAssemblyForType(Type类型,程序集调用Assembly) 在 System.Data.Objects.ObjectContext.GetTypeUsage(Type entityCLRType) 在 System.Data.Objects.ObjectContext.GetEntitySetForNameAndType(String entitySetName, Type entityCLRType, String exceptionParameterName) 在 System.Data.Objects.ObjectContext.CreateObjectSet [ TEntity](String entitySetName) 在 SSAMapper.Models.SSAMapperEntities.get_Cou D:\Projects\SSAMapper\Models\SSAMapper.Designer.cs 中的 ntry():D:\Projects\SSAMapper\Models\AdminModel 中 SSAMapper.Models.AdminModel.GetCountries(Boolean status, Boolean userCountry, Boolean loadDeactivatedCountry) 的第 240 行.cs:1116 行

【问题讨论】:

  • 错误表示重复。你能指定_db_Country的内容是什么吗?
  • 重复是我的第一个想法,但我检查了表格并且没有重复。我什至在代码中应用了 DISTINCT 子句,但仍然出现同样的错误。
  • 您能描述一下您的表结构有何相似之处以及您的价值观是什么?另外,您能否确认对 ToList() 的调用导致崩溃?您可以尝试执行 _db.Country.OrderBy(s => s.CountryName) 以查看它是否自行工作。
  • 好的。我仍然倾向于升级出错。它使用延迟加载,并且您已删除.ToList(),因此在任何数据访问之前都会引发异常。我们可以在堆栈跟踪中看到它是在创建ObjectSet&lt;TEntity&gt; 期间,如果我理解正确,它看起来是在查看关系以确保加载其类型的程序集时。我会查看 .edmx 中概念模型上的&lt;NavigationProperty&gt;s,看看是否有任何重复。如果您有重复的模型类或...,这似乎也可能发生
  • @xr280xr,升级出错绝对是唯一的解释,因为在全新的 ASP.NET MVC 5 和 Entity Framework 6 项目中,相同的代码行执行得非常好。我只需要删除搞砸的 .EDMX 文件并从升级后的项目中重新创建它,然后只需进行一些代码更改以使其与实体框架 6 兼容。

标签: asp.net-mvc-5 entity-framework-6 entity


【解决方案1】:

我倾向于升级到 Entity Framework 6 出错了。它使用延迟加载,并且您已删除.ToList(),因此在任何数据访问之前都会引发异常。我们可以在堆栈跟踪中看到它是在创建ObjectSet&lt;TEntity&gt; 期间,如果我理解正确,它看起来是在查看关系以确保加载其类型的程序集时。

我会查看.edmx 中概念模型上的&lt;NavigationProperty&gt;s,看看是否有任何重复。如果您的项目中有重复的模型类,或者在您的 bin 中的多个程序集中定义了任何模型类,似乎也可能发生这种情况(例如,如果您重命名了项目/目标程序集但原始 dll 仍然存在)。

这里有几个可能有用的链接:Upgrading to Entity Framework 6 我会仔细检查并确保没有遗漏任何内容。而here was a question 与所涉及的源代码显示相同的错误。

【讨论】:

    猜你喜欢
    • 2021-08-06
    • 1970-01-01
    • 2012-11-26
    • 2013-03-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多