我正在使用MVC2和EF4编写应用程序。我已经从我的数据库创建了实体,我有一个Timesheet表和一个TimesheetEntry表。
我正在使用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 :-(只是想知道我是否一起在这里咆哮错误的树?
P.S。如果有人想要更多关于这些事情的信息,请告诉我。我可以发布更多代码。
答案 0 :(得分: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();
根据需要更新,删除和添加引用的类,而不是完全测试
答案 1 :(得分: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();