Добавление и удаление ассоциаций - Entity Framework - PullRequest
4 голосов
/ 04 июня 2009

Я пытаюсь разобраться с EF на этой неделе, и пока все хорошо, но я только что натолкнулся на свою первую серьезную загадку. У меня есть таблица предметов и таблица категорий. Каждый элемент может быть «помечен» многими категориями, поэтому я создал таблицу ссылок. Два столбца, один основной идентификатор элемента, другой основной идентификатор категории. Я добавил некоторые данные вручную в БД, и я могу запросить все это через EF в моем коде.

Теперь я хочу пометить новый элемент одной из существующих категорий. У меня есть идентификатор категории для добавления и идентификатор элемента. Я загружаю оба как объекты, используя 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 и в элементе нет элемента для поддержки текущей операции."

Я что-то пропустил? Разве это не правильный способ сделать это? Я пробую то же самое для удаления, и мне тоже не повезло.

Ответы [ 3 ]

1 голос
/ 10 июня 2009

Я думаю, что мне удалось ответить на этот вопрос самому. После долгих размышлений выясняется, что Entity Framework (как в VS2008 SP1) на самом деле не очень хорошо поддерживает многие отношения. Фреймворк создает список объектов из другого объекта через отношения, что очень хорошо, но когда дело доходит до добавления и удаления отношений, это не может быть сделано очень легко. Для этого вам нужно написать свои собственные хранимые процедуры, а затем зарегистрировать их в Entity Framework, используя маршрут импорта функций.

Существует также еще одна проблема с этим маршрутом в импорте этой функции, который ничего не возвращает, например, добавление отношения многие ко многим не добавляется в контекст объекта. Поэтому, когда вы пишете код, вы не можете просто использовать их так, как вы ожидаете.

А пока я просто продолжу выполнять эти процедуры старомодным способом с помощью executetenonquery (). Очевидно, что лучшая поддержка для этого должна прибыть в VS2010.

Если кто-то считает, что я неправильно понял мои факты, пожалуйста, не стесняйтесь поправлять меня.

0 голосов
/ 09 июня 2009

Поместили ли вы внешние ключи в оба столбца таблицы ссылок на элемент и категорию или определили отношение «многие ко многим» в деталях сопоставления?

0 голосов
/ 05 июня 2009

После того, как вы создали свой объект Item, вам необходимо установить объект Item для объекта Category в свойстве 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();
}
...