如何使用集合导航属性更新实体(使用MVC2)

时间:2010-11-05 14:55:41

标签: c# asp.net-mvc-2 entity-framework-4

我正在使用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。如果有人想要更多关于这些事情的信息,请告诉我。我可以发布更多代码。

2 个答案:

答案 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();