错误3002:映射片段的问题| c#linq to entities

109*_*793 59 c# linq-to-entities edmx

我有一个控制台应用程序,我想要做的是每次应用程序运行时,日期和时间都会发送到我的数据库中的表.

表结构如下:

FTPRuns

ID int

Last Run datetime
Run Code Online (Sandbox Code Playgroud)

很简单.

我已经在我的应用程序中更新了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());
                }
            }
Run Code Online (Sandbox Code Playgroud)

如果有人可以帮助我,我会非常感激:)

谢谢.

Dan*_*ner 95

您的实体模型具有两个属性的组合FTPRuns.IDFTPRuns.LastRun实体键,而您的表只有列FTPRuns.ID作为主键.因此,在您的模型中,您指定组合FTPRuns.ID并且FTPRuns.LastRun必须是唯一的,而您的数据库具有更强的要求,即FTPRuns.ID单独必须是唯一的.

只需FTPRuns.LastRun从实体键中排除该属性即可.也许这是偶然发生的,或者实体框架无法从数据库中获取主要密钥信息,并且不得不推断实体密钥.例如,视图没有主键,实体框架会将实体键推断为所有非可空列的组合.

  • 当你回答时,我只是在回答我的问题!我检查了model.edmx,我看到我将LastRun设置为实体键.不确定是怎么回事:S但现在已经修好了:)谢谢你的回复.一旦时间限制结束,我将标记为正确. (4认同)
  • 谢谢!对我来说,我添加了一个主键列,但由于某种原因,它无法取消选择旧的主键. (3认同)

ben*_*bia 44

DanielBrückner解决方案非常适合我!下面基本上是他的指示,但是以图形形式 - 这可能有助于懒惰的读者:).

你想要注意的是你在模型中的PK即

在此输入图像描述

我们可以看到我有一个PK叫id.现在,如果我看看我的EF模型:

在此输入图像描述

我只能看到指定的1个键,这是正确的.对我来说,情况并非如此,所有4列都是键.

如果右键单击该列(在VS上的EF图表中),您将获得勾选/取消选中的选项 Entity Key:

在此输入图像描述

确保这与您的模型匹配.在我的情况下,只id应勾选,保存和构建项目.


Kev*_*eus 19

当我更改表中的关键字段(在数据库中)并更新实体模型时,这发生在我身上.

旧密钥仍然存在于模型中,因此我进入.edmx文件中的对象属性并将密钥设置为False.修好了.


小智 15

我从edmx中删除了表(在edmx上选择导致问题的表 - >右键单击 - >删除)然后执行"从数据库更新的模型"

为我修好了


Mit*_*art 5

我从模型浏览器中删除了实体和类,并从数据库进行了更新以确保选择了表。这为我解决了这个问题。