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