错误3002:映射片段中存在问题 | C# Linq to Entities

70
我有一个控制台应用程序,我想要做的是每次运行应用程序时,将日期和时间发送到我的数据库中的一张表格。
表格结构如下:
FTPRuns

ID int

Last Run datetime

很简单。

我已经更新了应用程序中的model.edmx以反映这个新变化,但现在我收到了下面的错误信息,而我并不完全知道它的意思。

Error 3002: 映射起始处的片段存在问题。位于第1330行:表FTPRuns的键(FTPRuns.ID)可能会在运行时违反约束条件:列(FTPRuns.ID)被映射到概念层面上实体集FTPRuns的属性(FTPRuns.ID),但它们并没有形成实体集的键属性(FTPRuns.ID, FTPRuns.LastRun)。

这是我用来更新数据库的代码片段:

 using (ModelContainer ctn = new ModelContainer())
            {
                try
                {
                    FTPRun ftp = new FTPRun
                    {
                        LastRun = DateTime.Now
                    };

                    ctn.FTPRuns.AddObject(ftp);

                    int changes = ctn.SaveChanges();

                    Console.WriteLine(changes.ToString() + " Changes saved");
                    Console.WriteLine("The LastRun Date Has Been Updated");
                }
                catch (InvalidOperationException ex)
                {
                     Console.WriteLine(ex.ToString());
                }
            }

如果有人能帮助我,我会非常感激:)

谢谢。


你使用的是哪种数据库,表中的主键是什么? - Torbjörn Hansson
抱歉,我正在使用 SQL Server 数据库,并将 ID 列设置为主键。 - 109221793
8个回答

116
您的实体模型使用两个属性FTPRuns.IDFTPRuns.LastRun的组合作为实体键,而您的表只有列FTPRuns.ID作为主键。因此,在您的模型中,您指定FTPRuns.IDFTPRuns.LastRun的组合必须是唯一的,而您的数据库具有更强的要求,即仅FTPRuns.ID必须是唯一的。
请将FTPRuns.LastRun属性从实体键中排除。可能这是意外发生的,或者Entity Framework无法从数据库中获取主键信息,不得不推断实体键。例如,视图没有主键,Entity Framework将推断实体键为所有非空列的组合。

4
当你回复时,我正在发布我的问题答案!我查看了model.edmx文件,发现我把LastRun也设置为实体键了。不确定是怎么发生的:S,但现在已经解决了:) 感谢您的回复。一旦时间限制到期,我会标记为正确答案。 - 109221793
3
谢谢!对于我来说,我添加了一个主键列,但由于某种原因无法取消选择旧的主键。 - RayLoveless

69

Daniel Brückner的解决方案对我非常有效!以下是他基本上的指导,但以图形方式呈现——这可能有助于懒惰的读者:).

您需要注意的是Model中的PK, 例如:

enter image description here

我们可以看到我有一个名为id的PK。 现在,如果我查看我的EF模型:

enter image description here

我可以看到只指定了1个键,这是正确的。 对于我来说,情况并非如此,所有4列都是键。

如果你右键点击列(在VS的EF图中),你将得到选项来勾选或取消勾选Entity Key:

enter image description here

确保这与您的Model相匹配。 在我的情况下,只有id应该打勾,保存并构建项目。


顶级的东西,有帮助的 - MattStacey
为 GUI 版本点赞 - gemini88mill
正是我所需要的,虽然这可能是旧技术,但我们仍然必须使用它!干杯 - Andrew

22

当我在表格(数据库中)中更改关键字段并更新实体模型时,我遇到了这个问题。

旧的关键字段仍然存在于模型中,所以我进入.edmx文件中对象的属性,并将关键字设置为False。这解决了问题。


或者:进入edmx文件,删除表格,然后从数据库“更新模型”,再次添加表格。 - hormberg

16

我从edmx中删除了表格(在edmx中选择引起问题的表格->右键单击->删除),然后执行了“从数据库更新模型”

这样对我来说解决了问题


6
我从模型浏览器中删除了实体和类,并进行了来自数据库的更新,确保选择了表。这对我解决了问题。

3

我创建新表时忘记设置主键,随后在 SQL Management Studio 中进行了设置。完成后,我更新了 model.edmx 文件以反映更改,但出现了 3002 错误。

更新模型时所做的操作是将该表的所有列设置为“实体键”。因此,在查看 model.edmx 文件时,请找到相应的表格,并右键单击不同的属性,以确保仅选择了主键作为“实体键”。这解决了我的问题。


2

检查表的主键是否存在,如果存在,则: 1)打开.edmx文件,选择所有表并从模型中删除。 2)从数据库中更新模型,并再次添加所有需要的表。


2

我删除了edmx中的所有表格,然后执行了"从数据库更新模型"操作。 同时,请确保数据库有一个所有者。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接