错误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.ID
和FTPRuns.LastRun
作为实体键的组合,而您的表只有列FTPRuns.ID
作为主键。 因此,在您的模型中,您指定FTPRuns.ID
和FTPRuns.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更新模型并再次添加所有必需的表