67

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

表结构是这样的:

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());
                }
            }

如果有人可以帮助我,我将不胜感激:)

谢谢。

4

8 回答 8

112

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

FTPRuns.LastRun只需从实体键中排除该属性。这可能是偶然发生的,或者实体框架无法从数据库中获取主键信息,不得不推断实体键。例如,视图没有主键,实体框架会将实体键推断为所有不可为空的列的组合。

于 2010-11-26T09:29:38.003 回答
65

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

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

在此处输入图像描述

大家可以看到我有一个PK叫id。现在,如果我查看我的 EF 模型:

在此处输入图像描述

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

如果您右键单击该列(在 VS 的 EF 图中),您将可以选择勾选/取消勾选Entity Key:

在此处输入图像描述

确保这与您的模型匹配。就我而言,只id应勾选、保存和构建项目。

于 2015-10-14T08:26:02.467 回答
21

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

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

于 2010-12-16T18:28:25.123 回答
15

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

为我修好了

于 2013-02-06T11:54:03.553 回答
6

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

于 2016-05-14T13:42:10.147 回答
3

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

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

于 2015-04-09T10:19:37.043 回答
2

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

于 2013-05-03T12:27:52.327 回答
2

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

于 2015-07-24T08:48:30.480 回答