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

时间:2010-11-26 09:14:48

标签: c# linq-to-entities edmx

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

表结构如下:

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());
                }
            }

如果有人能帮助我,我将非常感激:)

感谢。

8 个答案:

答案 0 :(得分:92)

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

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

答案 1 :(得分:41)

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

您要注意的是您的模型中的PK,即

enter image description here

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

enter image description here

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

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

enter image description here

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

答案 2 :(得分:19)

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

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

答案 3 :(得分:13)

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

为我修好了

答案 4 :(得分:4)

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

答案 5 :(得分:3)

我在创建新表时忘了设置主键,所以我去了SQL Management Studio才能这样做。完成后,我更新了model.edmx文件以反映更改并得到3002错误。

在更新模型时,它所做的是将表的所有列设置为“实体键”。因此,在查看model.edmx文件时,找到相关表,然后右键单击不同的属性以确保只有主键选择了“实体键”。这解决了我的问题。

答案 6 :(得分:2)

我擦除了edmx中的所有表格,然后从数据库"更新模型"。 还要验证是否拥有数据库的所有者。

答案 7 :(得分:1)

检查表的主键(如果存在) 1)打开.edmx文件,选择所有表格并从模型中删除。 2)从DB更新模型并再次添加所有必需的表