错误3002:映射片段中的问题| c#linq到实体

我有一个控制台应用程序,我试图做的是每次运行应用程序,date和时间发送到我的数据库中的表。

表结构是这样的:

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

如果任何人都可以帮助我,我会非常感激:)

谢谢。

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

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

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

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

丹尼尔布鲁克纳解决scheme为我完美工作! 下面的内容基本上是他指导的内容,但是以graphicsforms – 这可能会帮助懒惰的读者:)。

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

在这里输入图像说明

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

在这里输入图像说明

我只能看到一个指定的密钥,这是正确的。 对我而言,情况并非如此,所有4列都是关键。

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

在这里输入图像说明

确保这符合你的模型。 在我的情况下,只有id应该打勾,保存和build立项目。

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

为我修好了

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

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

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

我删除了edmx中的所有表,然后“从数据库更新模型”。 另外validation拥有数据库的所有者。

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