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

Dar*_*oki 5 c# sql-server-2008 asp.net-mvc-4 entity-framework-5

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

在此输入图像描述

接下来,我无缘无故地尝试将我重命名的视图添加到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
Run Code Online (Sandbox Code Playgroud)

任何建议,将不胜感激.

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

ced*_*bal 11

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


小智 5

我遇到了完全相同的问题,并在上​​面 cedenbal 的答案中找到了解决方案的线索 - 重复的 EntitySetMapping 条目。问题是:如何在近 3Mb、包含 250 多个表的 EDMX 中找到它/它们。解决方案是 (a) 在 Visual Studio 中对 EDMX 类型的文件的“EntitySetMapping Name=”运行“查找全部”。这产生了 250 多个条目的列表(如预期),但不是以任何我可以发现重复项的顺序排列的。因此,(b) 将该列表剪切并粘贴到 Notepad++ 中,运行一个宏来删除干扰,只留下表名,(c) 将该列表剪切并粘贴到 Excel 中,然后对其进行 AZ 排序。然后 (d) 仔细观察列表以查找重复项。发现整个部分包含 8 个重复的 ESM!删除它们,保存 EDMX,在 Visual Studio 中重新加载 EDMX,重新运行“从数据库更新”,然后宾果游戏。


小智 5

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

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

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());
            }
        }
    }
}
Run Code Online (Sandbox Code Playgroud)


Dar*_*oki 0

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