更新后,EF CTP5映射失败

时间:2011-02-28 21:53:37

标签: c# mysql mapping entity-framework-ctp5

我正在尝试进行一对多映射,但在保存更新时遇到了一些困难 菜单可以有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);
  

修改       ...       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类,但是我可以将它映射为不同的吗?

  

修改

     

我正在使用MySQL

菜单表:
int MenuID
varchar标题
int ModuleID

模块表:
int ModuleID
varchar名称

2 个答案:

答案 0 :(得分:1)

在你的第二个例子中,我假设你从代码片段中删除了.SaveChanges()?

您的类结构和映射看起来是正确的,您是否已连接SQL事件探查器以查看第二个示例正在执行的命令.SaveChanges()?

答案 1 :(得分:0)

最后我想通了。这是一个愚蠢的noob错误:

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

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