C# 修改DAL时出错,System.ArgumentException,";已存在具有相同密钥的条目“;
好吧,我完全被这个难住了。我可能没有足够的信息发布在这里,但我甚至不知道从哪里开始寻找。 我正在尝试在DAL.edmx文件上“从数据库更新模型”。我将一个字段添加到以前未包含的视图中。我尝试刷新,然后尝试重命名数据库中的视图,并从DAL中删除该视图,以便重新添加它。两次我都得到了 接下来,我无缘无故地尝试将重命名后的视图添加到DAL中,得到了相同的异常。手动从DAL.tt中删除没有帮助。谷歌搜索了这个问题,只有两个不相关的结果。我甚至不知道从哪里开始找 我没有编写它,但这里是视图的源sql(如果有帮助的话)。EF不会添加重命名的视图这一事实暗示它可能与SQL有关?SQL在mngmnt studio中运行良好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(如
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,其他任何东西都不能触及它。我会继续尝试你解决了问题,或者你复制了错误是什么?