J'ai été frustré par cela pour un jour ... s'il vous plaît aider. J'ai une section de facture dans laquelle je suis capable d'ajouter dynamiquement de nouveaux éléments en ajoutant/supprimant des éléments DOM en utilisant JQuery ... j'ai déjà compris comment nommer ces éléments correctement afin qu'ils soient par conséquent correctement mappés le modèle et envoyer au paramètre d'action.ASP.NET MVC 3 EF CodeFirst - édition d'article DBContext
Alors disons que j'ai une action dans mon contrôleur appelé Edition avec le paramètre de type facture
[HttpPost]
public virtual ActionResult Edit(Invoice invoice) {
if (ModelState.IsValid) {
//code discussed below
}
return RedirectToAction("Index");
}
Le paramètre de facture contient toutes les données que je veux. Je n'ai pas de problème avec ça. Ce qui suit est le modèle d'objet.
public class Invoice
{
[Key]
public int ID { get; set; }
public InvoiceType InvoiceType { get; set; }
public string Description { get; set; }
public int Amount { get; set; }
public virtual ICollection<InvoiceItem> InvoiceItems { get; set; }
}
Notez le InvoiceItems collection - il contient une collection des éléments de facture insérés dynamiquement. Ce qui suit est le modèle InvoiceItem
[Table("InvoiceItems")]
public class InvoiceItem
{
[Key]
public int ID { get; set; }
[ForeignKey("Invoice")]
public int InvoiceID { get; set; }
public Invoice Invoice { get; set; }
public string Description { get; set; }
public int Amount { get; set; }
}
Et c'est là que je suis coincé.
Je ne peux pas insérer/mettre à jour les éléments de la collection Factures InvoiceItems dans la base de données par hasard. J'ai beaucoup cherché sur google et j'ai trouvé ces solutions - aucune de ces solutions ne fonctionne malheureusement.
Solution # 1 - un code bizarre avec SetValues:
Invoice origInvoice = db.Invoices.Single(x => x.ID == invoice.ID);
var entry = db.Entry(origInvoice);
entry.OriginalValues.SetValues(invoice);
entry.CurrentValues.SetValues(invoice);
db.SaveChanges();
Solution # 2 - l'ajout d'une nouvelle méthode de mise à jour à mon DbContext:
public void Update<T>(T entity) where T : class
{
this.Set<T>().Attach(entity);
base.ObjectContext.ObjectStateManager.ChangeObjectState(entity,System.Data.EntityState.Modified);
}
Solution # 3 - attacher une entité existante mais modifiée au contexte selon http://blogs.msdn.com/b/adonet/archive/2011/01/29/using-dbcontext-in-ef-feature-ctp5-part-4-add-attach-and-entity-states.aspx
db.Entry(invoice).State = EntityState.Modified;
db.SaveChanges();
Comment solution # 1 œuvres: mises à jour toutes les propriétés à l'exception InvoiceItems nouvellement ajoutés. SetValues () ignore la propriété ICollection. Cela fonctionnerait si j'ajoutais cette ligne juste avant db.SaveChanges();
origEntry.Entity.InvoiceItems = invoice.InvoiceItems;
... mais je ne crois pas que ce soit la bonne approche.
Fonctionnement de la solution 2: ne fonctionne pas du tout car il n'existe aucune propriété ObjectContext dans la classe DbContext.
Comment la solution 3 fonctionne: cette solution mettra à jour la facture, mais ignorera sinon InvoiceItems.
Informations complémentaires: Ce qui suit est le morceau de javascript qui est utilisé pour générer les éléments d'éléments qui sont mis en correspondance avec les propriétés de InvoiceItem.La dernière question: qu'est-ce que je fais mal? Quel est le problème d'avoir une nouvelle collection d'éléments par rapport à un autre modèle automatiquement inséré dans la base de données? Pourquoi est-il ignoré, lorsque le modèle parent est mis à jour avec succès?
Edit 1: corrections
Lorsque vous dites "impossible d'ajouter les éléments", qu'est-ce que cela signifie exactement? Cela signifie-t-il qu'une exception est générée? Si oui, quelle est l'exception? –
Oui, pouvez-vous s'il vous plaît signaler l'exception? – Jack