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