2016-05-15 7 views
0

Ich habe eine Einheit:Aktualisieren Teileinheit unter Verwendung von Entity Framework (mit rasiermesserAnsicht)

public class Organization 
{ 
    public int OrganizationId { get; set; } 
    [Required] 
    [StringLength(160)] 
    public string Name { get; set; } 
    public DateTime? CreatedOn { get; set; } 
    public DateTime? ModifiedOn { get; set; } 
    public virtual ICollection<Team> Teams { get; set; } 
    public virtual ICollection<ApplicationUser> Persons { get; set; } 
} 

Ich habe eine OrganizationViewModel erzeugten Daten zur Darstellung als auch zu sehen, wie die Schaffung neuer Einheiten. Ich kann es später map AutoMapper verwenden, bevor Änderungen an Datenbankspar Entity Framework ...

public class OrganizationViewModel 
{ 
    public int OrganizationId { get; set; } 
    [Required] 
    [StringLength(160)] 
    public string Name { get; set; } 
    public List<ApplicationUser> Persons { get; set; } 
} 

Ich habe eine Aktion Methode bearbeiten erstellt, die nur Benutzer (für dieses Beispiel zu bearbeiten Eigenschaft Namen erlauben sollten nur, aber in Wirklichkeit, es tut Update viele andere Eigenschaften, die ich habe) für diese Frage abgespeckt ..

Die Edit-Ansicht nur zwei Eigenschaften @Html.HiddenFor(model => model.OrganizationId) und @Html.EditorFor(model => model.Name)

Jetzt in [HttpPost]

Ich habe OrganizationViewModel mit aktualisierten Name Eigenschaft, aber Eigenschaft Persons bleibt Null, wenn Benutzer bereits in einer Organisation vorhanden sind EF löst einen Fehler aus, wie es vom Kontext nicht erwartet wird.

Ich könnte die Eigenschaften aktualisiert haben, die ich EXPLICITLY in Post-Methode aktualisieren möchte, aber ich möchte nicht alles manuell tun. Gibt es einen anderen Weg, wo ich sagen kann, dass nur die Entitäten aktualisieren, die ich möchte. Ich versuchte mit Bind 's Include und Exclude aber es hat null für Personen als gut.

Help me :)

+0

Das 'Bind'-Attribut dient zum Binden von Daten, die von der Ansicht an den Controller gesendet werden. Wollen Sie, dass 'Personen 'bevölkert sind (bearbeiten Sie sie?) In welchem ​​Fall haben Sie Formularsteuerelemente für jede Eigenschaft von' ApplicationUser 'generiert, und wenn ja, wie? –

+0

ja .. Ich will Personen bevölkert sein, aber ich will sie nicht in 'Edit.cshtml' zeigen –

+0

Aber warum? Wenn Sie für jede Eigenschaft von 'ApplicationUser' keine Formularsteuerelemente einschließen, werden keine Daten vom Client an die POST-Methode gesendet. Wenn Sie sie nicht bearbeiten, würden Sie das sowieso nicht tun. Wenn Sie die Sammlung von 'ApplicationUser' benötigen (nicht klar, warum Sie das brauchen), dann holen Sie sie einfach wieder in der POST-Methode. –

Antwort

0

Wenn Sie einen View-Modell erstellen, die nur die OrganizationId und Namen Eigenschaften enthält, die von dieser Ansicht bearbeitet werden, können Sie es durch Ausführen

db.Entry(db.Organizations 
    .First(x => OrganizationId == viewModel.OrganizationId)) 
    .CurrentValues.SetValues(yourViewModel); 

yourViewModel erreichen - sein kann Jedes Objekt mit einer Reihe von Eigenschaften, die Sie aktualisieren möchten. Sie müssen also Ihren Code nicht wiederholen, aber Sie müssen für jede Operation ein bestimmtes Ansichtsmodell haben. Möglicherweise haben Sie es sogar lokal für die Update-Methode und automatisieren es, aber es muss nur Eigenschaften haben, die Sie aktualisieren möchten.

Verwandte Themen