2017-06-22 74 views
1

我在一個ASP.Net MVC項目中使用EF6和Mapster。在我的編輯後控制器中,我試圖保存數據輸入表單的結果。在表單上有一個多選列表框。多選列表框中的選擇正在順利傳遞,但我不瞭解將多選列表中的所選項目保存到數據庫的正確方法。使用下面的DisplayName屬性中的代碼將被保存,但團隊不會被保存。 (該小組表具有多對多的關係到myRecord表)更新實體和子實體列表之間的密鑰?

控制器代碼來保存修改:

var myRecord = TypeAdapter.Adapt<MyRecord>(myRecordViewModel); 
    myRecord.Teams   = db.Teams.Where(a => myRecordViewModel .SelectedTeamIDs.Contains(a.TeamID)).ToList();    
    myRecord.DisplayName  = myRecordViewModel.Name; 
    db.Entry(myRecord).State = EntityState.Modified; 
    db.SaveChanges(); 

myRecord類:

public class MyRecord 
{ 
    [Key] 
    public int Id { get; set; } 
    public string DisplayName { get; set; } 
    public virtual ICollection<Team> Teams { get; set; } 
} 

等級:

public partial class Team 
{ 
    public int TeamID { get; set; } 
    public string TeamName { get; set; } 
    public virtual ICollection<MyRecord> MyRecords{ get; set; } 
} 

這應該如何保存到數據庫?

回答

2

State設置爲Modified(將實體附加到上下文並將所有基元屬性標記爲已修改)對於簡單場景都適用,但在有相關數據時不適用。

這裏是一個不附加數據庫跳閘操作的順序,但允許EF變更跟蹤器正確地識別應用更改所需的數據庫操作:

(1)從數據庫加載原始實體,包括收集 (2)更新主信息 (3)替換爲新數據的收集 (4)保存

var myRecord = TypeAdapter.Adapt<MyRecord>(myRecordViewModel); 
myRecord.DisplayName = myRecordViewModel.Name; 
// (1) 
var dbRecord = db.MyRecords.Include(x => x.Teams).FirstOrDefault(x => x.Id == myRecord.Id); 
// (2) 
db.Entry(dbRecord).CurrentValues.SetValues(myRecord); 
// (3) 
dbRecord.Teams = db.Teams.Where(a => myRecordViewModel .SelectedTeamIDs.Contains(a.TeamID)).ToList(); 
// (4) 
db.SaveChanges();