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

时间:2015-09-25 13:18:14

标签: c# sql-server-2008 asp.net-mvc-4 entity-framework-5

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

enter image description here

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

我没有写它,但这里是视图的源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

任何建议都将不胜感激。

UPDATE:使用相同的SQL创建品牌打击新视图,然后通过相同的方法将其添加到DAL,同样的错误。

6 个答案:

答案 0 :(得分:10)

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

答案 1 :(得分:2)

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

答案 2 :(得分:1)

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

答案 3 :(得分:1)

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

通过一次性的小型程序来解决此问题,该程序可查找重复的映射条目

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());
            }
        }
    }
}

答案 4 :(得分:0)

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

答案 5 :(得分:0)

就我而言,以下解决方案有所帮助:

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

重复的EntitySetMapping

duplicated EntitySetMapping