2012-05-16 5 views
0

Je pense avoir lu tous les articles et toutes les questions de débordement de pile à ce sujet, mais je ne trouve pas la solution. Permettez-moi de commencer avec mes modèlesMise à jour des relations FK dans Entity Framework 4.1

public class Entry 
{ 
    public Entry() 
    { 
     DateEntered = DateTime.Now; 
    } 

    public int Id { get; set; } 
    [Required] 
    public string FirstName { get; set; } 
    [Required] 
    public string LastName { get; set; } 
    [Required] 
    public string Email { get; set; } 
    public string Number { get; set; } 
    public string FbId { get; set; } 
    [ReadOnly(true)] 
    public DateTime DateEntered { get; set; } 
    public string AccessToken { get; set; } 

    //Relationsips 
    public Backgrounds Background { get; set; } 
    public Cars Car { get; set; } 
} 

public class Backgrounds 
{ 
    public int Id { get; set; } 
    public string Name { get; set; } 
    public string Filename { get; set; } 
} 

public class Cars 
{ 
    public int Id { get; set; } 
    public string Name { get; set; } 
    public string FileName { get; set; } 
} 

Maintenant, dans mon contrôleur, je mets à jour l'entrée. Comme suit

// PUT /api/entries/5 
    public HttpResponseMessage Put(Entry entry) 
    { 
     if(ModelState.IsValid) 
     { 

      _db.Entries.Attach(entry); 
      _db.Entry(entry).State = EntityState.Modified; 
      _db.SaveChanges(); 

      return new HttpResponseMessage(HttpStatusCode.NoContent); 
     } 

     throw new HttpResponseException(HttpStatusCode.BadRequest); 
    } 

Mon modèle d'entrée est mis à jour correctement, mais si pour par exemple entry.Background.Name changements, ce ne sera pas persisté à la base de données. Mon contrôleur accepte le modèle entier d'entrée comprenant ses relations => arrière-plans et voitures. Cependant, toute valeur qui est modifiée pour la relation n'est pas mise à jour ou reflétée. Toute solution élégante sans avoir à interroger la base de données puis la mise à jour? Je ne veux pas avoir des requêtes ou des recherches supplémentaires avant de mettre à jour.

Merci

Tyrone

Répondre

0

Vous devez dire manuellement EF de tous les changements effectués sur le graphe d'objet. Vous avez dit à EF que vous étiez sur le point de changer d'instance d'entrée, mais vous ne lui avez pas parlé d'un changement d'entités ou de relations connexes. Il n'y a pas de manière élégante de résoudre cela. Vous avez généralement deux options:

  • Vous utiliserez des DTO à la place de vos entités et ces DTO aurez du drapeau comme IsDirty - lorsque vous recevez objet graphique à votre contrôleur, vous reconstruire des entités de DTO et définir leur fonction état au IsDirty. Cette solution nécessite d'autres extensions, par exemple si votre client peut également supprimer des relations.
  • Vous allez interroger le graphe d'objet à partir de la base de données et fusionner vos modifications entrantes aux entités extraites de la base de données.

Il y a quelques solutions partielles comme obligeant à enregistrer les modifications à tous les objets liés par la mise en état de nouveaux objets modifiés et l'identification par Id == 0 mais encore une fois ces solutions ne fonctionnent que dans des scénarios spécifiques.

Plus complexe discussion à propos de ce problème.

Questions connexes