2010-11-05 3 views
2

Я пишу приложение с использованием MVC2 и EF4. Я создал объекты из моей базы данных, у меня есть таблица расписаний и таблица 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 в БД :-(Просто ? интересно, если 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)) .ObjectContext.ApplyCurrentValues ​​(«TimesheetEntries», e)); 'для EF6. – beawolf

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

+2

Я тоже читал документацию «вызывающе»! :) –

Смежные вопросы