好的,这是场景。我有3张桌子。一个名为aspnet_Users的名为Categories,一个名为User_Categories的链接表。 aspnet_Users和Categories都有主键(分别是UserId和ID)。链接表只有两列:CategoryID和UserId,并且每列都设置了外键关系,并且我对User_Categories上的两列有唯一的键设置。这将在aspnet_Users表和Categories表之间建立多对多关系。我从这个数据库设置生成了我的实体edmx文件,一切看起来都很完美,几乎适用于所有操作。
我想要做的是从表单中添加一个新类别(它自己完美地工作),同时还将特定用户与新提交的类别相关联。当我尝试这样做时,我在主题行中得到错误。这是我用来尝试这个的代码(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");
}
为什么这不起作用?
答案 0 :(得分:39)
我认为完整的异常消息类似于:
无法更新EntitySet YourTableName ,因为它具有DefiningQuery,并且ModificationFunctionMapping元素中不存在任何InsertFunction元素以支持当前操作。
如果您的数据库表没有定义主键,则会发生这种情况。
向表中添加主键(使用SQL Server Management Studio或其他),并从数据库中更新.edmx
模型。
答案 1 :(得分:2)
错误:无法更新EntitySet,因为它具有DefiningQuery
我有两次这个错误,两次我到处寻找答案,最后我的映射搞砸了,或者数据库没有主键或什么的。我建议全部检查......
答案 2 :(得分:2)
我遇到同样的问题,我通过以下链接修复:
我根据第3个链接的内容删除了.edmx中的 DefiningQuery 部分。然后一切都像魅力一样。
答案 3 :(得分:2)
将复合主键放在映射表上,这将告诉EF正确处理它。