错误 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.IDFTPRuns.LastRun 这两个属性组合为实体键,而您的表只有FTPRuns.ID 列作为主键。因此,在您的模型中,您指定 FTPRuns.IDFTPRuns.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 到实体的主要内容,如果未能解决你的问题,请参考以下文章

错误3004:从行开始映射片段时出现问题

EF添加关联的提示问题:映射从第 260 行开始的片段时有问题:

添加新实体标量时实体框架 4 映射片段错误

片段着色器中的球面映射

学习小片段——springboot 错误处理

如何通过C#中的特定片段从句子中提取整个单词?