我有一个控制台应用程序,我想要做的是每次应用程序运行时,日期和时间都会发送到我的数据库中的表。
表结构如下:
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());
}
}
如果有人能帮助我,我将非常感激:)
感谢。
答案 0 :(得分:92)
您的实体模型将两个属性FTPRuns.ID
和FTPRuns.LastRun
组合为实体键,而您的表只有列FTPRuns.ID
作为主键。因此,在您的模型中,您指定FTPRuns.ID
和FTPRuns.LastRun
的组合必须是唯一的,而您的数据库要求FTPRuns.ID
必须是唯一的。
只需从实体键中排除属性FTPRuns.LastRun
即可。也许这是偶然发生的,或者实体框架无法从数据库中获取主要密钥信息,并且不得不推断实体密钥。例如,视图没有主键,实体框架会将实体键推断为所有非可空列的组合。
答案 1 :(得分:41)
Daniel Brückner解决方案对我来说非常合适!下面基本上是他的指示,但是以图形形式 - 这可能有助于懒惰的读者:)。
您要注意的是您的模型中的PK,即
我们可以看到我有一个名为id
的PK。现在,如果我看看我的EF模型:
我只能看到指定的1个键,这是正确的。对我来说,情况并非如此,所有4列都是键。
如果右键单击该列(在VS上的EF图表中),您将可以选择勾选/取消选中Entity Key:
确保这与您的模型匹配。在我的情况下,只应勾选id
,保存并构建项目。
答案 2 :(得分:19)
当我更改表中的关键字段(在数据库中)并更新实体模型时,这发生在我身上。
模型中仍然存在旧密钥,因此我进入.edmx文件中的对象属性并将密钥设置为False。修好了。
答案 3 :(得分:13)
我从edmx中删除了表格(在edmx上选择导致问题的表格 - >右键单击 - >删除) 然后执行“从数据库更新的模型”
为我修好了
答案 4 :(得分:4)
我从模型浏览器中删除了实体和类,并从数据库执行了更新,确保选择该表。这解决了我的问题。
答案 5 :(得分:3)
我在创建新表时忘了设置主键,所以我去了SQL Management Studio才能这样做。完成后,我更新了model.edmx文件以反映更改并得到3002错误。
在更新模型时,它所做的是将表的所有列设置为“实体键”。因此,在查看model.edmx文件时,找到相关表,然后右键单击不同的属性以确保只有主键选择了“实体键”。这解决了我的问题。
答案 6 :(得分:2)
我擦除了edmx中的所有表格,然后从数据库"更新模型"。 还要验证是否拥有数据库的所有者。
答案 7 :(得分:1)
检查表的主键(如果存在) 1)打开.edmx文件,选择所有表格并从模型中删除。 2)从DB更新模型并再次添加所有必需的表