错误 3002:映射片段时出现问题 |时间:2019-03-17 标签:c#linqtoentities

问题描述 投票:0回答:9

我有一个控制台应用程序,我想做的是每次应用程序运行时,日期和时间都会发送到我的数据库中的表中。

表结构是这样的:

FTPRuns

ID int

Last Run datetime

很简单。

我已经在我的应用程序中更新了 model.edmx 来反映这一新的更改,但是现在我收到以下错误,我不完全确定这意味着什么。

错误3002:映射问题 从行开始的片段 1330:潜在的运行时违规 表 FTPRuns 的键 (FTPRuns.ID): 列 (FTPRuns.ID) 映射到 EntitySet FTPRuns 的属性 (FTPRuns.ID) 概念方面 但它们不形成 EntitySet 关键属性(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());
                }
            }

如果有人可以帮助我,我将非常感激:)

谢谢。

c# linq-to-entities edmx
9个回答
116
投票

您的实体模型具有

FTPRuns.ID
FTPRuns.LastRun
两个属性的组合作为实体键,而您的表仅具有
FTPRuns.ID
列作为主键。因此,在您的模型中,您指定
FTPRuns.ID
FTPRuns.LastRun
的组合必须是唯一的,而您的数据库有更强的要求,即
FTPRuns.ID
单独必须是唯一的。

只需从实体键中排除属性

FTPRuns.LastRun
即可。也许这是意外发生的,或者实体框架无法从数据库获取主键信息,而不得不推断实体键。例如,视图没有主键,实体框架会将实体键推断为所有不可为空列的组合。


69
投票

Daniel Brückner 解决方案非常适合我!下面基本上是他的指示,但是以图形形式 - 这可能会帮助懒惰的读者:)。

您要注意的是您在模型中的 PK,即

我们可以看到我有一个名为

id
的PK。现在,如果我查看我的 EF 模型:

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

如果右键单击该列(在 VS 上的 EF 图表中),您将获得勾选/取消勾选

Entity Key:

的选项

确保这与您的型号相匹配。就我而言,只需勾选

id
,保存并构建项目。


22
投票

当我更改表(数据库中)中的关键字段并更新实体模型时,这发生在我身上。

旧密钥仍然存在于模型中,因此我进入 .edmx 文件中的对象属性并将密钥设置为 False。这解决了它。


16
投票

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

这为我解决了问题


6
投票

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


3
投票

我在创建新表时忘记设置主键,所以我进入 SQL Management Studio 来设置主键。完成后,我更新了 model.edmx 文件以反映更改并收到 3002 错误。

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


2
投票

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


2
投票

我删除了 edmx 中的所有表,然后“从数据库更新模型”。 还要验证数据库的所有者。


0
投票

我有一个非常相似的问题,但我相信 VS2022 中的错误是根本原因。我从数据库更新了模型以将新表添加到我的模型中。但由于某种原因,它修改了模型中的现有表以具有多个键。我从数据库验证应该只有一个键,并将其他值更改为不是键。一旦我这样做了,错误就消失了。

© www.soinside.com 2019 - 2024. All rights reserved.