2011-09-14 5 views
0

J'ai un modèle de référencement auto avec clé primaire composite dans ASP.NET MVC 3 en utilisant le code première approche:Mise à jour composite clé étrangère

public class Area 
{ 
    [Key, Column(Order=0)] 
    public int Id1 { get; set; } 

    [Key, Column(Order=1)] 
    public int Id2 { get; set; } 

    public string Name { get; set; } 

    public virtual Area Parent { get; set; } 
} 

Et je voudrais avoir un contrôleur avec des opérations créer et modifier qui peut fonctionne avec toutes les propriétés, y compris le composite Parent (qui doit être préalablement ajouté à la base de données).

J'ai réussi à faire fonctionner la méthode create, mais pour éditer le champ complexe ne veut pas mettre à jour. Les données d'entrée pour la méthode suivante analyse avec succès l'objet area qui a également area.Parent.Id1 et area.Parent.Id2 ensemble.

code actuel qui n'enregistre pas les modifications de modifications à Parent:

[HttpPost] 
    public ActionResult Edit(Area area) 
    { 
     try 
     { 
      if (ModelState.IsValid) 
      { 
       if (area.Parent != null) 
       { 
        area.Parent = db.Areas.Find(area.Parent.Id1, area.Parent.Id2); 
        if (area.Parent == null) 
         throw new NotFoundException(); 
        // need to mark it as modified... 
       } 
       db.Entry(area).State = EntityState.Modified; 
       db.SaveChanges(); 
       return RedirectToAction("Index"); 
      } 
     } 
     catch (NotFoundException) 
     { 
      //... 
     } 
     return View(area); 
    } 

Répondre

0

J'ai trouvé une sorte de solution de contournement si quelqu'un en a besoin. Ajouter à cela le modèle:

[ForeignKey("Parent"), Column(Order = 0)] 
    public int Parent_Id1 { get; set; } 
    [ForeignKey("Parent"), Column(Order = 1)] 
    public int Parent_Id2 { get; set; } 

Et ajouter ce où il est dit « besoin de marquer comme modifiée »:

    area.Parent_Id1 = area.Parent.Id1; 
        area.Parent_Id2 = area.Parent.Id2; 
Questions connexes