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文件,删除表,然后从数据库更新模型,然后再次添加表。