修改 DAL 时出错,System.ArgumentException,"An entry with the same key already exist"
Error modifying DAL, System.ArgumentException, "An entry with the same key already exist"
好的,我完全被这个难住了。我可能没有足够的信息来 post 这里,但我什至不知道从哪里开始寻找。
我正在尝试 "Update Model from database" 我的 DAL.edmx 文件。我在之前未包含的视图中包含了一个字段。我尝试刷新,然后尝试重命名数据库中的视图并从 DAL 中删除视图,这样我就可以 re-add 它了。两次我都得到
接下来,我无缘无故地尝试将重命名的视图添加到 DAL 中,但出现了同样的异常。从 DAL.tt 中手动删除没有帮助。用 Google 搜索问题,只有 2 non-relevant 个结果。我什至不知道从哪里开始寻找。
不是我写的,但这里是视图的来源 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。你应该删除一个,一切都会好的。尝试删除视图的所有映射并重新添加它们。如果这不起作用,请尝试查看模型浏览器视图和 Model/Entity 类型下的内容。旧迁移期间可能会留下一些实体,当您尝试使用相同的键添加 table 时,会发生错误。希望这有帮助 ;]
我不知道这是否有帮助,因为我对它的了解还不够多,但我碰巧看到部分 class vw_BillingIssues.cs 实际上有额外的字段它。我在整个解决方案范围内搜索了术语 "vw_BillingIssues" 并将额外的字段添加到任何缺少它的列表或集合中(几乎在其他任何地方),重建解决方案并成功!我确实注意到某处它提到视图的基础表没有定义主键,但不记得我在哪里看到的。
我遇到了完全相同的问题。正如我所注意到的,问题出现在 .edmx 文件与 Subversion 合并之后。在文本编辑器中查看 .edmx 文件,我发现了一个重复的 EntitySetMapping 条目。手动删除重复后,问题解决!
希望这有帮助
我遇到了完全相同的问题,并在上述 cedenbal 的回答中找到了解决方案的线索 - 重复的 EntitySetMapping 条目。问题是:如何在包含 250 多个表的近 3Mb 的 EDMX 中找到 it/them。解决方案是 (a) 运行 a "Find All" in Visual Studio on "EntitySetMapping Name=" on EDMX 类型的文件。这产生了一个包含 250 多个条目的列表(如预期的那样),但没有按任何我可以发现重复项的顺序排列。所以 (b) 将列表剪切并粘贴到 Notepad++ 中,运行 一个宏来删除 chaff,只留下表名,(c) 将这个列表剪切并粘贴到 Excel 中,然后按 A-Z 排序。然后 (d) 只是盯着列表寻找重复项。发现一整节包含 8 个重复的 ESM!删除它们,保存 EDMX,在 Visual Studio、重新 运行 "Update from database" 中重新加载 EDMX,然后宾果游戏。
就我而言,以下解决方案有所帮助:
使用 XML 编辑器打开 .edmx
文件并尝试查找重复的 EntitySetMapping
。
重复EntitySetMapping
:
remove/add 不适合我当前的项目。
用一个一次性的查找重复映射项的小程序解决了这个问题
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());
}
}
}
}
我喜欢通过编写程序解决它的答案,但我使用 Excel:
解决了它
- 用XML编辑器打开edmx,复制所有内容
- 将内容粘贴到 Excel
- 向包含以下数据的列添加过滤器
包括“
- 扫描列表中的重复项(我只有 150 个条目,所以只需要快速视觉扫描)
此外,我创建了第二列,其中所有值都被修剪,并对该列进行了所有分析。花了我 3 分钟,我发现了重复的条目并手动从 edmx 中删除了它们。
好的,我完全被这个难住了。我可能没有足够的信息来 post 这里,但我什至不知道从哪里开始寻找。 我正在尝试 "Update Model from database" 我的 DAL.edmx 文件。我在之前未包含的视图中包含了一个字段。我尝试刷新,然后尝试重命名数据库中的视图并从 DAL 中删除视图,这样我就可以 re-add 它了。两次我都得到
接下来,我无缘无故地尝试将重命名的视图添加到 DAL 中,但出现了同样的异常。从 DAL.tt 中手动删除没有帮助。用 Google 搜索问题,只有 2 non-relevant 个结果。我什至不知道从哪里开始寻找。
不是我写的,但这里是视图的来源 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。你应该删除一个,一切都会好的。尝试删除视图的所有映射并重新添加它们。如果这不起作用,请尝试查看模型浏览器视图和 Model/Entity 类型下的内容。旧迁移期间可能会留下一些实体,当您尝试使用相同的键添加 table 时,会发生错误。希望这有帮助 ;]
我不知道这是否有帮助,因为我对它的了解还不够多,但我碰巧看到部分 class vw_BillingIssues.cs 实际上有额外的字段它。我在整个解决方案范围内搜索了术语 "vw_BillingIssues" 并将额外的字段添加到任何缺少它的列表或集合中(几乎在其他任何地方),重建解决方案并成功!我确实注意到某处它提到视图的基础表没有定义主键,但不记得我在哪里看到的。
我遇到了完全相同的问题。正如我所注意到的,问题出现在 .edmx 文件与 Subversion 合并之后。在文本编辑器中查看 .edmx 文件,我发现了一个重复的 EntitySetMapping 条目。手动删除重复后,问题解决! 希望这有帮助
我遇到了完全相同的问题,并在上述 cedenbal 的回答中找到了解决方案的线索 - 重复的 EntitySetMapping 条目。问题是:如何在包含 250 多个表的近 3Mb 的 EDMX 中找到 it/them。解决方案是 (a) 运行 a "Find All" in Visual Studio on "EntitySetMapping Name=" on EDMX 类型的文件。这产生了一个包含 250 多个条目的列表(如预期的那样),但没有按任何我可以发现重复项的顺序排列。所以 (b) 将列表剪切并粘贴到 Notepad++ 中,运行 一个宏来删除 chaff,只留下表名,(c) 将这个列表剪切并粘贴到 Excel 中,然后按 A-Z 排序。然后 (d) 只是盯着列表寻找重复项。发现一整节包含 8 个重复的 ESM!删除它们,保存 EDMX,在 Visual Studio、重新 运行 "Update from database" 中重新加载 EDMX,然后宾果游戏。
就我而言,以下解决方案有所帮助:
使用 XML 编辑器打开 .edmx
文件并尝试查找重复的 EntitySetMapping
。
重复EntitySetMapping
:
remove/add 不适合我当前的项目。
用一个一次性的查找重复映射项的小程序解决了这个问题
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());
}
}
}
}
我喜欢通过编写程序解决它的答案,但我使用 Excel:
解决了它- 用XML编辑器打开edmx,复制所有内容
- 将内容粘贴到 Excel
- 向包含以下数据的列添加过滤器
包括“
- 扫描列表中的重复项(我只有 150 个条目,所以只需要快速视觉扫描)
此外,我创建了第二列,其中所有值都被修剪,并对该列进行了所有分析。花了我 3 分钟,我发现了重复的条目并手动从 edmx 中删除了它们。