2010-11-05 61 views
2

我正在使用MVC2和EF4編寫應用程序。我從我的數據庫創建實體,我有一個Timesheet表和一個TimesheetEntry表。我如何使用MVC2更新具有集合導航屬性的實體

我正在使用MVC2的模型綁定功能,並且成功地接收Timesheet對象,並且其TimesheetEntries填充了用戶創建的TimesheetEntries。

如果我使用我在其他方法使用(這裏的時間表是由MVC框架創建的對象)的技術:

Timesheet temp = context.Timesheets 
        .Include("TimesheetEntries") 
        .Where(t => t.Id == timesheet.Id).First(); 
context.ApplyCurrentValues<Timesheet>(temp.EntityKey.EntitySetName, timesheet); 
context.SaveChanges(); 

然後我TimesheetEntries不會被保存。

我一直在嘗試沒有成功通過其他方式來做到這一點,如刪除所有條目:

Timesheet temp = context.Timesheets 
     .Include("TimesheetEntries") 
     .Where(t => t.Id == timesheet.Id).First(); 

context.ApplyCurrentValues<Timesheet>(temp.EntityKey.EntitySetName, timesheet); 

context.ExecuteStoreCommand(@"DELETE FROM TimesheetEntry WHERE Timesheet=" + timesheet.Id.ToString()); 
foreach (TimesheetEntry entry in timesheet.TimesheetEntries) 
{ 
    entry.Timesheet = timesheet.Id; 
    context.TimesheetEntries.AddObject(entry); 
} 
context.SaveChanges(); 
return Redirect("ListTimesheets?PersonnelId="+timesheet.Person); 

這是不正常的,我仍然沒有得到TimesheetEntries到DB :-(剛?想知道如果這裏IAM找錯了樹一起

PS如果任何人想在這些事情的詳細信息,讓我知道,我可以發佈更多的代碼

回答

4

在這裏再次時間表是由MVC映射

Timesheet DBTimesheet = context.Timesheets 
        .Include("TimesheetEntries") 
        .Where(t => t.Id == timesheet.Id).First(); 

//Delete if in database but not in submission 
DBTimesheet.TimesheetEntries 
    .Where(dbE => !timesheet.TimesheetEntries.Any(e => e.Id == dbE.Id)).ToList() 
    .ForEach(dbE => context.TimesheetEntries.DeleteObject(dbE)); 

//Update if in submission and in database 
timesheet.TimesheetEntries 
    .Where(e => DBTimesheet.TimesheetEntries.Any(dbE => dbE.Id == e.Id)).ToList() 
    .ForEach(e => context.TimesheetEntries.ApplyCurrentValues(e)); 

//Add if in submission but not in database 
timesheet.TimesheetEntries 
    .Where(e => !DBTimesheet.TimesheetEntries.Any(dbE => dbE.Id == e.Id)).ToList() 
    .ForEach(e => DBTimesheet.TimesheetEntries.Add(e)); 

context.SaveChanges(); 

更新,刪除創建的類,並根據需要,完全測試再添引用的類

+0

我測試它,它完美的作品。我必須將更新部分的'context.TimesheetEntries.ApplyCurrentValues(e)'改爲'((IObjectContextAdapter)context).ObjectContext.ApplyCurrentValues(「TimesheetEntries」,e));'用於EF6。 – beawolf 2016-10-08 17:21:53

3

閱讀ApplyCurrentValues的文檔;它標量屬性只要。

但你可以這麼做:

Timesheet temp = context.Timesheets 
        .Include("TimesheetEntries") 
        .Where(t => t.Id == timesheet.Id).First(); 
context.ApplyCurrentValues<Timesheet>(temp.EntityKey.EntitySetName, timesheet); 
foreach(var tse in timesheet.TimesheetEntries) 
{ 
    temp.TimesheetEntries.Add(tse); // or update, if need be. 
} 
context.SaveChanges(); 
+1

邪惡的好。謝謝,我想你已經突出了一些非常好的東西。目前不完全正常,但我會嘗試一些事情。關於閱讀更多的好點,我將不得不這樣做;-) – gordatron 2010-11-05 17:59:51

+2

我也閱讀文檔「挑釁」,也! :) – 2010-11-05 18:53:48