2010-11-05 4 views
2

J'écris une application en utilisant MVC2 et EF4. J'ai créé des entités à partir de ma base de données, j'ai une table de feuille de temps et une table TimesheetEntry. J'utilise les fonctionnalités de liaison de modèle de MVC2 et recevoir avec succès un objet Timesheet avec ses entrées de feuille de temps remplies avec les entrées de feuille de temps créées par l'utilisateur.Comment mettre à jour une entité avec une propriété de navigation de collection (avec MVC2)

Si j'utilise la technique que je l'ai utilisé dans d'autres méthodes (ici l'objet feuille de temps est créé par le framework MVC):

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

Alors mes TimesheetEntries ne sont pas sauvés.

J'ai essayé sans succès de le faire par d'autres moyens, comme la suppression de toutes les entrées:

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); 

Ce ne fonctionne pas correctement, je ne suis toujours pas obtenir TimesheetEntries dans le DB :-(Juste ? se demander si les aboiements iam le mauvais arbre ici tous ensemble

PS si quelqu'un veut plus d'informations sur l'une de ces choses faites-moi savoir et je peux poster plus de code

Répondre

4

à nouveau ici la feuille de temps est la classe créée par la mise en correspondance 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(); 

Mises à jour, supprime et ajoute des classes référencées au besoin, non vérifié

+0

Je l'ai testé et cela fonctionne parfaitement. J'ai dû changer 'context.TimesheetEntries.ApplyCurrentValues ​​(e)' sur la section de mise à jour '((contexte (IObjectContextAdapter)) .ObjectContext.ApplyCurrentValues ​​(" TimesheetEntries ", e));' pour EF6. – beawolf

3

Lire la documentation ApplyCurrentValues;.. elle fait des propriétés scalaires seulement.

Mais vous pouvez faire:

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

Vraiment bien. Merci, je pense que vous avez souligné quelque chose de très bien là-bas. Ça ne fonctionne pas vraiment pour le moment mais je vais essayer quelques trucs. Bon point sur la lecture de plus, je vais devoir le faire avec défi ;-) – gordatron

+2

J'ai lu la documentation "avec défi", aussi! :) –

Questions connexes