Как обновить сущность с помощью свойства навигации по коллекции (с MVC2) - PullRequest
2 голосов
/ 05 ноября 2010

Я пишу приложение, используя MVC2 и EF4. Я создал объекты из своей базы данных, у меня есть таблица расписаний и таблица расписаний.

Я использую функции привязки модели в MVC2 и успешно получаю объект расписания с его элементами 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();

Тогда мои записи расписания не сохраняются.

Я безуспешно пытался сделать это другими способами, например, удалить все записи:

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 в БД :-( Просто интересно, не все ли здесь лает в неправильном дереве?

P.S. если кто-то хочет больше информации о любой из этих вещей, дайте мне знать. и я могу выложить больше кода.

Ответы [ 2 ]

4 голосов
/ 08 ноября 2010

снова здесь расписание - это класс, созданный отображением 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();

Обновляет, удаляет и добавляет ссылочные классы по мере необходимости, НЕ ПОЛНОСТЬЮ ПРОВЕРЕНО

3 голосов
/ 05 ноября 2010

Прочтите документацию по 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();
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...