2010-08-12 56 views
15

好的,这里是场景。我有3张桌子。一个叫aspnet_Users的叫做Categories,一个叫做User_Categories的链接表。 aspnet_Users和Categories都有主键(分别是UserId和ID)。链接表只有两列:CategoryID和UserId,并且为每列设置了外键关系,并且我为User_Categories上的两列设置了唯一的键设置。这在aspnet_Users表和Categories表之间建立了多对多的关系。我从这个数据库设置中生成了我的实体edmx文件,而且一切看起来都很完美,几乎适用于所有操作。实体框架4错误:无法更新实体集,因为它有一个定义查询

我想要做的是从表单中添加一个新的类别(它自己完美地工作),并且同时还将特定用户与新提交的类别相关联。当我尝试这样做时,我的主题行中出现错误。这里是我用来试试这个代码(ctx是我的实体上下文对象):

public ActionResult Create(Category category, Guid userId) 
{ 
    aspnet_Users user = ctx.aspnet_Users.SingleOrDefault(x => x.UserId == userId); 
    ctx.Categories.AddObject(category); 
    user.Categories.Add(category); 
    ctx.SaveChanges();; 
    return RedirectToAction("Index"); 
} 

为什么不能正常工作?

回答

38

我承担全部异常消息是类似于:

Unable to update the EntitySet YourTableName because it has a DefiningQuery and no InsertFunction element exists in the ModificationFunctionMapping element to support the current operation.

此,如果你的数据库的表没有定义主键会发生。

将一个主键添加到您的表中(使用SQL Server Management Studio或其他),并从数据库更新您的.edmx模型。

+1

如果你在一个视图而不是一个表上得到这个结果会发生什么! – Necronet 2010-10-29 16:33:03

+1

@Necronet,对不起,我不能说。视图也可以定义键,对吗?你有没有定义你的观点? – 2010-10-30 00:35:55

+0

是的,但EF似乎是自动设置我的钥匙(并随机太),我试图用XML编辑器编辑dmx,但每次我更新它设置关键马上回来,不知道为什么... – Necronet 2010-10-30 02:59:00

2

错误:无法更新EntitySet的,因为它有一个DefiningQuery

两次我得到这个错误,我两次寻找答案随处可见,到底我的映射一塌糊涂,或者数据库没有主键或一些东西。我建议检查了这一切......

2

在映射表上放置一个复合主键,这会告诉EF正确处理它。