2011-02-28 130 views
0

我正在嘗試進行一對多映射,但在保存更新時遇到了一些困難。
菜單可以有0到1個模塊。
模塊可以有0到多個菜單。EF CTP5映射更新失敗

當我做一個新的菜單對象並保存它時,模塊被保存到數據庫中,但在更新時不是。

這是工作:

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

... 
DbContext.SaveChanges() 
... 

保存帶有外鍵模塊的菜單項。
菜單ID: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到菜單類,但我可以映射這個不同?

Edit:

I'm using MySQL

菜單表:
INT菜單ID
VARCHAR標題
INT的moduleId

模塊表:
INT的moduleId
VARCHAR名稱

回答

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! 
} 
1

在第二個例子中,我假設你離開.SaveChanges()退出代碼片段?

您的類結構和映射看起來是否正確,您是否掛鉤了SQL Profiler以查看第二個示例正在執行的命令.SaveChanges()?

+0

我添加了缺少.SaveChanges()。對不起,我忘了提及我使用MySQL,所以我不能使用SQL Profiler :( – Frets

+0

經過更多的調查後,我發現,當我嘗試保存附加模塊的菜單對象時,沒有任何更新db。但是如果保存沒有附加模塊的菜單對象,所有事情都會在db中更新。 – Frets