2009-12-26 76 views
0

我是新来的实体框架。 一周之前,我遇到了当前上下文的常见问题,如果以非独特的方式使用,会引发异常,但这是固定的。奇怪的约束与实体框架异常

今天我有一个新问题,一个真正新的问题,因为我不知道为什么会发生这种情况,因为我确实认为我有相同的代码。

这里是我得到的错误:

Entities in 'Entities.WSUser_Detail' participate in 
the 'FK_WSUser_Detail_WSCountry' relationship. 
0 related 'WSCountry' were found. 1 'WSCountry' is expected. 

为何如此奇怪这个错误是,在我的代码我从来没有引用任何WSUser_Detail对象。 有没有人想出这种错误? 我的代码是非常简单的:在调用SaveChanges()

绝对没有WSUser_Detail被称为在我的代码发生

newUser = (from user in GB.Context.WSUsers 
       where user.IDUser == nFound 
       select user).FirstOrDefault(); 

newUser.DoNotSend = false; 
newUser.IP = Request.UserHostAddress; 
newUser.LastDtActivity = DateTime.Now; 
newUser.Language1 = GB.User.Language; 
newUser.LastVersion = sVersion; 
newUser.FlushNextTime = false; 

GB.Context.SaveChanges(); 

的错误...所以我不知道他为什么要问这是一个参考一个永远不会被调用的对象(但存在于实体上下文中)。

有什么想法?

奇怪的是,即使代码似乎没有改变,我也没有这个问题。

我更新了Model.edmx以确保它不是原因,但它仍然不起作用,我已经检查了很多次,并且由于没有任何WSUser_Detail对象,所以错误不应该发生。

+0

我也测试过创建一个空白页面,里面只有这个代码,并且它失败时有相同的约束异常: using System; using System.Collections.Generic;使用System.Linq的 ; using System.Web; using System.Web.UI; using System.Web.UI.WebControls; 使用palarcdbModel; 公共部分类AS_Default2:System.Web.UI.Page { 保护无效的Page_Load(对象发件人,EventArgs的) { WSUser X =新WSUser(); x.Email =“[email protected]”; x.Language =“fr”; GB.Context.AddToWSUsers(x); GB.Context.SaveChanges(); } } 任何想法? – Micael 2009-12-26 06:20:57

+2

更新你的问题,不要只是添加评论。 – 2009-12-26 06:23:17

回答

1

在数据库级别,我猜测你对一个不允许为NULL的字段有一个外键约束,并且你得到的模型在WSCountry和WSUser表之间有关系。

它看起来像你可能试图挽救无效的实体 - 一个不符合您的约束..

我的猜测是,你WSUser需要有一个WSCountry实体集。是否有WSUser.WSCountry属性设置?

如果我的预感是正确的 - 确保这是在保存之前设置的。

顺便说一句 - 'FK_WSUser_Detail_WSCountry'不建议一个对象 - 它指的是在数据库中建立的关系/ FK约束。实体框架使用这些约束来猜测您的实体应该如何关联。

+0

感谢您的回答。我知道这是由于NULL值造成的,也可能是由于关系失败造成的,但正如我在帖子中所说的,WSUser和WSCountry之间没有这种联系。 这就是为什么这对我来说很奇怪......这个错误以前没有发生过,我不知道发生了什么变化,但WSUser表和WSCountry之间仍然没有任何联系。没有任何数据库关系被改变,唯一可能失败的是代码,但在我的情况下,代码不应该失败,因为我没有碰到需要引用WSCountry的entitiy对象。 – Micael 2009-12-27 06:22:16

+0

也许你可以发表一些关于你的实体模型结构的更多细节 - 如果不知道你有什么,很难猜测。 有像User-> UserDetail-> Country这样的实体吗? – markt 2009-12-27 20:02:21

1

使用这个检查sys系统目录视图的小SQL脚本,您应该能够找出哪个数据库约束位于哪两个表(及其列)涉及这个问题 - 检查出来,很可能这是一个必需的参考,例如你不能把它留空(你现在可能在你的代码中)。

SELECT 
    fk.name , 
    t1.Name 'Parent table', 
    c1.Name 'Parent column', 
CASE WHEN c1.is_nullable = 0 THEN 'No' ELSE 'Yes' 
END AS 'Parent column nullable', 
    t2.Name 'Referenced table', 
    c2.Name 'Referenced column' 
FROM 
    sys.foreign_keys fk 
INNER JOIN 
    sys.foreign_key_columns fkc ON fk.object_id = fkc.constraint_object_id 
INNER JOIN 
    sys.tables t1 ON fkc.parent_object_id = t1.object_id  
INNER JOIN 
    sys.tables t2 ON fkc.referenced_object_id = t2.object_id 
INNER JOIN 
    sys.columns c1 ON t1.object_id = c1.object_id AND fkc.parent_column_id = c1.column_id 
INNER JOIN 
    sys.columns c2 ON t2.object_id = c2.object_id AND fkc.referenced_column_id = c2.column_id 
WHERE 
    fk.name = 'FK_WSUser_Detail_WSCountry' 

这应该给你父表和列以及引用的表和列 - 例如,涉及你的外键关系的两方。

这应该有希望清除你错过了什么拼图。

+0

嗨!不幸的是(在某种程度上,如果这样我会很开心,因为我知道我的系统中有什么问题),我的数据库是正确的,我已经运行了你的脚本,它显示了我的预期(因为我已经已经检查,因为异常的堆栈跟踪约束谈论约束检查 有脚本的唯一结果: FK_WSUser_Detail_WSCountry \t WSUser_Detail \t IDCountry \t没有\t WSCountry \t IDCountry 的结果是正确的,我估计它有只是一个且唯一的链接,它在WSUser_Detail和WSCountry之间。没有任何内容链接到WSUser。 – Micael 2009-12-27 06:25:02

0

您的模型(EDMX)表示WSUser和WSUser_Detail之间存在1:1的关系,但您的问题意味着您期望关系为1:0..1,所以无论您自己理解还是您的模型是不正确。如果模型具有1:1关系的基数,那么无论您何时创建或保存WSUser实体,实体框架都会检查这一点。这是您看到的错误的来源。

因为你的问题意味着这是这种关系的错误基数,你可能想去修复EDMX。为此,请在模型浏览器中找到FK_WSUser_Detail_WSCountry关联。单击它,然后在“属性”窗口中展开两个End属性。更改适当结束的多重性。

0

我终于找到了问题所在!

我在使用全局上下文,如下所示。 但在之前的一些测试中,我添加了一个不包含任何需要的wscountry引用的用户详细信息。 所以它首先遇到了一个异常,这是我所期望的。

真正的问题是,无论何时通过方法AddTo(entityObj)添加无效的实体对象,对SaveChanges()的任何进一步调用都会尝试将该对象添加到上下文中,即使导致问题的页面由于Context对象“已损坏”,因此不再存在。

所以每次调用的SaveChanges()将通过一个无效的实体对象的任何AddTo就后一个异常被拒绝......

我的问题是:是否有可能有这样的有效性的信息实体之前尝试将其添加到使用的上下文中? 因为这样的致命错误是合乎逻辑的,但很难理解,因为它显示几个小时前(使用全局上下文处理ASP.Net项目时)发生的错误。