C# 修改DAL时出错,System.ArgumentException,";已存在具有相同密钥的条目“;

C# 修改DAL时出错,System.ArgumentException,";已存在具有相同密钥的条目“;,c#,sql-server-2008,asp.net-mvc-4,entity-framework-5,C#,Sql Server 2008,Asp.net Mvc 4,Entity Framework 5,好吧,我完全被这个难住了。我可能没有足够的信息发布在这里,但我甚至不知道从哪里开始寻找。 我正在尝试在DAL.edmx文件上“从数据库更新模型”。我将一个字段添加到以前未包含的视图中。我尝试刷新,然后尝试重命名数据库中的视图,并从DAL中删除该视图,以便重新添加它。两次我都得到了 接下来,我无缘无故地尝试将重命名后的视图添加到DAL中,得到了相同的异常。手动从DAL.tt中删除没有帮助。谷歌搜索了这个问题,只有两个不相关的结果。我甚至不知道从哪里开始找 我没有编写它,但这里是视图的源sql(如

好吧,我完全被这个难住了。我可能没有足够的信息发布在这里,但我甚至不知道从哪里开始寻找。 我正在尝试在DAL.edmx文件上“从数据库更新模型”。我将一个字段添加到以前未包含的视图中。我尝试刷新,然后尝试重命名数据库中的视图,并从DAL中删除该视图,以便重新添加它。两次我都得到了

接下来,我无缘无故地尝试将重命名后的视图添加到DAL中,得到了相同的异常。手动从DAL.tt中删除没有帮助。谷歌搜索了这个问题,只有两个不相关的结果。我甚至不知道从哪里开始找

我没有编写它,但这里是视图的源sql(如果有帮助的话)。EF不会添加重命名的视图这一事实暗示它可能与SQL有关?SQL在mngmnt studio中运行良好

SELECT     ID, IssueID, IssueTypeID, IssueText, IssueCreateDate, WeekendDate, CustomerName, Employee, 
                  CONVERT(DECIMAL(6, 2), AdjustedTotalRHours, 101) AS AdjustedTotalRHours, AdjustedTotalOHours, 
                  AdjustedTotalRHours + AdjustedTotalOHours AS Hours, InvoiceNumber, AdjustedInvoiceAmount, 
                  COALESCE
                      ((SELECT     SUM(InvoiceAmount) AS Expr1
                          FROM         TrendingDataFinal AS I1
                          WHERE     (InvoiceNumber = T1.InvoiceNumber) AND (CompanyID = T1.CompanyID) AND 
                                                (CalType = 'F') AND (Aident = T1.Aident)), 0) AS TotalInvoiceAmount, InvoiceDate, 
                  ROUND(DATEDIFF(DAY, InvoiceDate, GETDATE()), 0) AS DaysOutstanding, Notes, Aident, EINC, IsClosed, 
                  CompanyID,
                      (SELECT     COUNT(ne.EntryID) AS Expr1
                        FROM          Madison.Notes.Note AS n INNER JOIN
                                               Madison.Notes.NoteEntry AS ne ON n.NoteID = ne.NoteId
                        WHERE      (n.Key1 = T1.InvoiceNumber)) AS HasNotes, COALESCE
                      ((SELECT     TOP (1) CompanyName
                          FROM         ReportingCompanies AS I1
                          WHERE     (CompanyId = T1.CompanyID)), '') AS CompanyName, BranchName, PayStatus
FROM         BillMan_ReportStage AS T1
如有任何建议,将不胜感激


更新:使用相同的SQL创建了全新的视图,并使用相同的方法将其添加到DAL中,出现了相同的错误。

您可能有两个相同的节点:EntitySetMapping。你应该删除一个,一切都会好起来。尝试删除视图的所有映射,然后再次添加它们。如果不起作用,请尝试在“模型浏览器”视图和“模型/图元类型”下查看。在旧迁移过程中可能会留下一些实体,当您尝试添加具有相同键的表时,会发生错误。希望这有帮助;]

我不知道这是否有帮助,因为我不知道如何理解它,但我碰巧看到部分类vw_BillingIssues.cs实际上有额外的字段。我对术语“vw_BillingIssues”进行了解决方案范围的搜索,并将额外字段添加到任何缺少它的列表或集合中(几乎在其他任何地方),重建了解决方案并成功!我确实注意到它提到视图的基础表没有定义主键,但我不记得在哪里看到的。

我也有同样的问题。正如我所注意到的,这个问题是在将.edmx文件与Subversion合并后出现的。在文本编辑器中查看.edmx文件,我发现一个重复的EntitySetMapping条目。手动删除副本后,问题得到解决!
希望这有帮助

我遇到了完全相同的问题,并在上面cedenbal的答案中找到了解决方案的线索-重复EntitySetMapping条目。问题是:如何在具有250多个表的几乎3Mb的EDMX中找到它/它们。解决方案是(a)在Visual Studio中对EDMX类型的文件“EntitySetMapping Name=”运行“全部查找”。这产生了一个250多个条目的列表(正如预期的那样),但没有任何顺序,我可以发现重复的条目。因此,(b)将列表剪切并粘贴到记事本++,运行一个宏来去除糠秕,只留下表名,(c)将此列表剪切并粘贴到Excel中,并将其排序为a-Z。然后(d)仅查看列表以查找重复项。找到了一个包含8个重复ESM的完整部分!删除它们、保存EDMX、在VisualStudio中重新加载EDMX、重新运行“从数据库更新”和宾果游戏

在我的案例中,以下解决方案有帮助:

使用XML编辑器打开
.edmx
文件,并尝试查找重复的
EntitySetMapping

重复的
EntitySetMapping


删除/添加不适合我当前的项目

用一个查找重复映射项的一次性小程序解决了这个问题

using System.Collections.Generic;
using System.IO;
using System.Linq;

namespace EntityModelHelper
{
    class Program
    {
        static void Main(string[] args)
        {
            // path to edmx file
            var filesPath = @"SamePath\Model.edmx";
            var lines = File.ReadAllLines(filesPath);
            var searchNames = new List<string>();
            foreach (var line in lines)
            {
                var searchString = "<EntitySetMapping Name=";
                if (line.Contains(searchString))
                {
                    var tmp = line.Substring(line.IndexOf(searchString) + searchString.Length+1);
                    var searchName = tmp.Substring(0, tmp.IndexOf("\""));
                    searchNames.Add(searchName);
                }
            }
            foreach (var duplicateName in searchNames.GroupBy(x => x).Where(x => x.Count() > 1))
            {
                Console.WriteLine(duplicateName.First());
            }
        }
    }
}
使用System.Collections.Generic;
使用System.IO;
使用System.Linq;
命名空间EntityModelHelper
{
班级计划
{
静态void Main(字符串[]参数)
{
//edmx文件的路径
var filesPath=@“SamePath\Model.edmx”;
var lines=File.ReadAllLines(filepath);
var searchNames=新列表();
foreach(行中的var行)
{
var searchString=“x).其中(x=>x.Count()>1))
{
Console.WriteLine(duplicateName.First());
}
}
}
}

Thanx的回应,但这个东西是巨大的,已经被许多开发人员研究了很多年。我不相信它里面没有额外的东西。然而,这一个表和视图只支持一页上的一个gridview,其他任何东西都不能触及它。我会继续尝试你解决了问题,或者你复制了错误是什么?