При обновлении EF CTP5 происходит сбой при обновлении - PullRequest
0 голосов
/ 01 марта 2011

Я пытаюсь выполнить сопоставление «один ко многим», но у меня возникают трудности с сохранением обновлений.
Меню может содержать от 0 до 1 модуля.
Модуль может иметь от 0 до многих меню.

Когда я создаю новый объект меню и сохраняю его, модуль сохраняется в БД, но при обновлении это не так.

Это работает:

var menu = new Menu()
menu.Title = "Menu Title";
menu.Module = repository.GetModule(2);

...
DbContext.SaveChanges()
...

Сохраняет пункт меню с внешним ключом в модуле.
MenuID: 1
ModuleID: 2

Когда я пытаюсь сделать обновление следующим образом:

var menu = repository.GetMenu(1);
menu.Module = repository.GetModule(3);

Edit: ... DbContext.SaveChanges () ...

ModuleID в таблице меню не изменяется. Что не так?


Моя модель:

public class Menu
{
   [Key]
   public int MenuID { get; set; }
   public string Title { get; set; }
   public int ModuleID { get; set; } <-- Is this necessary

   public virtual Module Module { get; set; }
}

public class Module
{
   [Key]
   public int ModuleID { get; set; }
   public string Name { get; set; }

   public virtual ICollection<Menu> Menus { get; set; }
}

Отображение:

protected override void OnModelCreating(System.Data.Entity.ModelConfiguration.ModelBuilder modelBuilder)
{
   modelBuilder.Entity<Module>().HasMany<Menu>(m => m.Menus).WithOptional().HasForeignKey(m => m.ModuleID);
}

Чтобы заставить работать мое отображение, мне нужно было добавить ModuleID в класс Menu, но могу ли я отобразить это по-другому?

Edit:

Я использую MySQL

Таблица меню:
int MenuID
varchar название
int ModuleID

Таблица модулей:
int ModuleID
varchar имя

Ответы [ 2 ]

1 голос
/ 01 марта 2011

Во втором примере я предполагаю, что вы оставили .SaveChanges () из фрагмента кода?

Структура и отображение вашего класса выглядят правильно, вы подключили SQL Profiler, чтобы увидеть, какая команда выполняется во втором примере .SaveChanges ()?

0 голосов
/ 06 марта 2011

Наконец я понял это.Это была глупая ошибка нуба:

public ActionResult Edit(int id, MenuModel menu)
{
   var menuDb = repository.Get(id);
   TryUpdateModel(menuDb);

   //repository.save(menu); <-- WRONG!
   repository.save(menuDb); <-- BINGO... It works! 
}
...