4

这周我正在努力掌握 EF,到目前为止我还不错,但我刚刚遇到了我的第一个主要障碍。我有一个项目表和一个类别表。每个项目都可以用许多类别“标记”,所以我创建了一个链接表。两列,一列是项目的主要 ID,另一列是类别的主要 ID。我手动向数据库添加了一些数据,我可以在我的代码中通过 EF 很好地查询它们。

现在我想用现有类别之一“标记”一个新项目。我有要添加的类别 ID 和项目的 ID。我使用 linq 将两者都加载为实体,然后尝试以下操作。

      int categoryToAddId = Convert.ToInt32(ddlCategoriesRemaining.SelectedValue);
  var categoryToAdd = db.CollectionCategorySet.First(x => x.ID == categoryToAddId);
  currentCollectionItem.Categories.Add(categoryToAdd);
  db.SaveChanges(); 

但我得到“无法更新 EntitySet 'collectionItemCategories',因为它有一个 DefiningQuery 并且元素中不存在支持当前操作的元素。”

我错过了什么吗?这不是正确的方法吗?我尝试同样的方法来移除,但也没有运气。

4

3 回答 3

1

我想我自己已经设法回答了这个问题。经过大量挖掘后发现,实体框架(在 VS2008 SP1 中提供)实际上并不能很好地支持多对多关系。该框架确实通过关系从另一个对象创建了一个对象列表,这非常好,但是在添加和删除关系时,这不能很容易地完成。您需要编写自己的存储过程来执行此操作,然后使用函数导入路由将它们注册到实体框架。

这条路线还有一个进一步的问题,即不返回任何内容的函数导入(例如添加多对多关系)不会被添加到对象上下文中。因此,当您编写代码时,您不能像预期的那样使用它们。

现在,我将简单地坚持使用 executenonquery() 以老式方式执行这些过程。显然,VS2010 应该会对此提供更好的支持。

如果有人觉得我的事实有误,请随时纠正我。

于 2009-06-10T10:20:16.667 回答
0

创建 Item 对象后,您需要将 Item 对象设置为 Item 的 Categories 属性上的 Category 对象。如果要添加新的 Item 对象,请执行以下操作:

Using (YourContext ctx = new YourContext())
{
   //Create new Item object
   Item oItem = new Item();
   //Generate new Guid for Item object (sample)
   oItem.ID = new Guid();
   //Assign a new Title for Item object (sample)
   oItem.Title = "Some Title";
   //Get the CategoryID to apply to the new Item from a DropDownList
   int categoryToAddId = Convert.ToInt32(ddlCategoriesRemaining.SelectedValue);
   //Instantiate a Category object where Category equals categoryToAddId
   var oCategory = db.CategorySet.First(x => x.ID == categoryToAddId);
   //Set Item object's Categories property to the Category object
   oItem.Categories = oCategory;
   //Add new Item object to db context for saving
   ctx.AddtoItemSet(oItem);
   //Save to Database
   ctx.SaveChanges();
}
于 2009-06-05T02:43:21.763 回答
0

您是否在链接表的两列上都放置了外键到项目和类别,或者在映射详细信息中定义了多对多的关系?

于 2009-06-09T11:33:26.940 回答