C# 错误3002:将片段| c linq映射到实体时出现问题

C# 错误3002:将片段| c linq映射到实体时出现问题,c#,linq-to-entities,edmx,C#,Linq To Entities,Edmx,我有一个控制台应用程序,我要做的是,每次应用程序运行时,日期和时间都会发送到数据库中的一个表中 表结构如下所示: FTPRuns ID int Last Run datetime 很简单 我已经在我的应用程序中更新了model.edmx,以反映这一新的更改,但是现在我得到了以下错误,我不完全确定这意味着什么 错误3002:映射中存在问题 从第行开始的片段 1330:潜在的运行时违反 表FTPRuns的键FTPRuns.ID: 列FTPRuns.ID映射到 EntitySet FTPRuns

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

表结构如下所示:

FTPRuns

ID int

Last Run datetime
很简单

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

错误3002:映射中存在问题 从第行开始的片段 1330:潜在的运行时违反 表FTPRuns的键FTPRuns.ID: 列FTPRuns.ID映射到 EntitySet 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());
                }
            }
如果有人能帮助我,我将非常感激:


谢谢。

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


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

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


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

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


这为我修复了它

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

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


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

检查表的主键,如果它存在,那么 1打开.edmx文件,选择所有表格并从模型中删除。 2从DB更新模型并再次添加所有必需的表格

解决方案对我来说非常有效!以下基本上是他所指示的,但以图形的形式-这可能会帮助懒惰的读者:

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

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

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

如果右键单击VS上EF图中的列,您将获得勾选/取消勾选实体键的选项:


确保这与您的型号匹配。在我的例子中,只有id应该被勾选,保存并构建项目

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

您使用的是什么类型的数据库,表上的主键是什么?抱歉,我使用的是SQL Server数据库,并且我已将ID列设置为主键。您回答我的问题时,我刚刚发布了答案!我查看了model.edmx,发现我的LastRun也设置为实体键。不知道是怎么回事,但现在已经修好了,谢谢你的回复。一旦期限到了,我会打正确的分数。谢谢!对我来说,我添加了一个主键列,但由于某种原因,它无法取消选择旧的主键。最重要的东西,帮助投票的GUI版本正是我所寻找的,它可能是旧技术,但我们仍然必须使用它!,CheeserAlternative:转到edmx文件,删除表,然后从数据库更新模型,然后再次添加表。