错误 3002:映射片段中的问题 | c# linq 到实体
Posted
技术标签:
【中文标题】错误 3002:映射片段中的问题 | c# linq 到实体【英文标题】:Error 3002: Problem in mapping fragments | c# linq to entities 【发布时间】:2011-05-16 02:20:15 【问题描述】:我有一个控制台应用程序,我想做的是每次应用程序运行时,日期和时间都会发送到我数据库中的一个表中。
表结构是这样的:
FTPRuns
ID int
Last Run datetime
足够简单。
我已经更新了我的应用程序中的 model.edmx 以反映这一新变化,但是现在我收到以下错误,我不完全确定这意味着什么。
错误 3002:映射问题 从行开始的片段 1330:潜在的运行时违规 表 FTPRuns 的键 (FTPRuns.ID): 列 (FTPRuns.ID) 映射到 EntitySet FTPRuns 的属性 (FTPRuns.ID) 在概念方面 但它们不构成 EntitySet 的 关键属性(FTPRuns.ID, FTPRuns.LastRun)。
这是我用来更新数据库的代码的 sn-p:
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());
如果有人可以帮助我,我将非常感激:)
谢谢。
【问题讨论】:
你用的是什么数据库,表的主键是什么? 抱歉,我使用的是 SQL Server 数据库,我已将 ID 列设置为主键。 【参考方案1】:您的实体模型将FTPRuns.ID
和FTPRuns.LastRun
这两个属性组合为实体键,而您的表只有FTPRuns.ID
列作为主键。因此,在您的模型中,您指定 FTPRuns.ID
和 FTPRuns.LastRun
的组合必须是唯一的,而您的数据库有更强的要求,即单独的 FTPRuns.ID
必须是唯一的。
只需从实体键中排除属性FTPRuns.LastRun
。这可能是偶然发生的,或者实体框架无法从数据库中获取主键信息,不得不推断实体键。例如,视图没有主键,实体框架会将实体键推断为所有不可为空的列的组合。
【讨论】:
我刚刚在您回复时发布了我的问题的答案!我检查了 model.edmx,发现我也将 LastRun 设置为实体键。不知道这是怎么发生的:S,但现在已经修复了:)感谢您的回复。一旦时间限制到了,我会标记为正确的。 谢谢!对我来说,我添加了一个主键列,但由于某种原因它无法取消选择旧的主键。【参考方案2】:Daniel Brückner 解决方案非常适合我!以下基本上是他的指示,但以图形形式 - 这可能会帮助懒惰的读者:)。
您要注意的是您在模型中的 PK,即
我们可以看到我有一个名为id
的PK。现在,如果我查看我的 EF 模型:
我只能看到指定的 1 个键,这是正确的。对我来说,情况并非如此,所有 4 列都是键。
如果您右键单击该列(在 VS 的 EF 图中),您将可以选择勾选/取消勾选 Entity Key:
确保这与您的模型相匹配。在我的情况下,只有id
应该被勾选、保存和构建项目。
【讨论】:
顶的东西,有帮助 支持 GUI 版本 正是我想要的,它可能是旧技术,但我们仍然需要使用它!,干杯【参考方案3】:当我更改表中的键字段(在数据库中)并更新实体模型时,这发生在我身上。
旧密钥仍在模型中,因此我进入 .edmx 文件中的对象属性并将密钥设置为 False。这样就解决了。
【讨论】:
或者:转到edmx文件,删除表,然后“从数据库中更新模型”并再次添加表。【参考方案4】:我从 edmx 中删除了表(在 edmx 上选择导致问题的表 -> 右键单击 -> 删除) 然后执行“从数据库更新模型”
帮我修好了
【讨论】:
【参考方案5】:我从模型浏览器中删除了实体和类,并从数据库中进行了更新,确保选择了表。这为我解决了这个问题。
【讨论】:
【参考方案6】:创建新表时忘记设置主键,所以我去 SQL Management Studio 进行设置。完成后,我更新了 model.edmx 文件以反映更改并得到 3002 错误。
在更新模型时,它所做的是将表的所有列设置为“实体键”。所以在查看model.edmx文件的时候,找到相关的表,在不同的属性上点右键,确保只有主键有“Entity key”被选中。这解决了我的问题。
【讨论】:
【参考方案7】:检查表的主键,如果存在则 1) 打开 .edmx 文件,选择所有表并从模型中删除。 2)从数据库更新模型并再次添加所有需要的表
【讨论】:
【参考方案8】:我从 edmx 中删除了所有表,然后“从数据库更新模型”。 还要验证是否拥有数据库的所有者。
【讨论】:
以上是关于错误 3002:映射片段中的问题 | c# linq 到实体的主要内容,如果未能解决你的问题,请参考以下文章