2016-06-17 9 views
0

Ich versuche, zwei Objekte in einer Datenbank gleichzeitig zu aktualisieren. Mit meinem derzeitigen Code scheint es nur meine Navigationseigenschaft zu aktualisieren. Zum Beispiel, wenn sich der "Score" in meiner ersten Klasse ändert, wird er nicht aktualisiert. Aber wenn sich etwas in der zweiten Klasse ändert, wird es korrekt aktualisiert. Ich bin mir nicht sicher, was ich hier falsch mache. Dies ist Code-First-Entity-Framework.Wie aktualisieren Sie die Navigationseigenschaften im Entitätsframework?

Ich habe zwei Klassen:

public class SampleClass 
{ 
    [Key] 
    [DatabaseGenerated(DatabaseGeneratedOption.Identity)] 
    public int Id { get; set; } 
    public int TestId { get; set; } 
    public string Items { get; set; } 
    public int Score { get; set; } 

    public IList<Test> Test { get; set; } 
} 

Und eine andere Klasse, die wie folgt aussieht:

public class Test 
{ 
    [Key] 
    [DatabaseGenerated(DatabaseGeneratedOption.Identity)] 
    public int TestId { get; set; } 
    public double RawScore { get; set; } 
    public double PercentScore { get; set; } 

    public int SampleClassId { get; set; } 

    [ForeignKey("SampleClassId")] 
    public virtual SampleClass SampleClass { get; set; } 
} 

So aktualisieren Sie in der Datenbank, die ich dieses:

var entry = context.Entry(sampleFormClass); 
    entry.State = System.Data.Entity.EntityState.Modified; 
    entry.Property(e => e.Items).IsModified = false; 

    foreach (var navigationProperty in myTestClass.Test) 
    { 
      var entityEntry = context.Entry(navigationProperty); 
      entityEntry.State = System.Data.Entity.EntityState.Modified; 
      entityEntry.Property(navProp => navProp.SampleClassId).IsModified = false; 
    } 

    context.FormData.Attach(sampleFormClass); 
    } 
    context.SaveChanges(); 

Wenn ich entfernen das foreach in meiner Methode, das Objekt zu aktualisieren, dann wird es meine nav-Eigenschaft nicht aktualisieren. Wie kann ich sowohl mein Objekt als auch seine Objektliste gleichzeitig aktualisieren?

Lösung für mein Problem

bearbeiten: Ich konnte mein eigenes Problem beheben, indem Sie den Code in meiner Update-Methode auf diese Neuanordnung:

context.FormData.Attach(sampleFormClass); 

    var entry = context.Entry(sampleFormClass); 
    entry.State = System.Data.Entity.EntityState.Modified; 
    entry.Property(e => e.Items).IsModified = false; 

    foreach (var navigationProperty in myTestClass.Test) 
    { 
      var entityEntry = context.Entry(navigationProperty); 
      entityEntry.State = System.Data.Entity.EntityState.Modified; 
      entityEntry.Property(navProp => navProp.SampleClassId).IsModified = false; 
    } 


    } 
    context.SaveChanges(); 

Ich zog die Linie, wo Sie hängen das Objekt an, das Sie über alles andere aktualisieren werden.

+1

Ich verstehe nicht, warum Menschen weiterhin mit dem Ändern des Entitätszustands manuell umherschrauben. Es muss da draußen ein wirklich schlechtes Tutorial geben, dem die Leute folgen. Ändern Sie einfach die Eigenschaften, die Sie ändern möchten, und rufen Sie 'SaveChanges' auf, EF kümmert sich um den Rest. Mögliches Duplikat von [Wie wird der Datensatz mit Entity Framework 6 aktualisiert?] (Http://stackoverflow.com/questions/25894587/how-to-update-record-using-entity-framework-6) –

+1

@CraigW. In vielen Fällen verhindert dies einen Hin- und Rückweg zur Datenbank. Es kann oder kann nicht gerechtfertigt sein, [es hängt davon ab] (http://stackoverflow.com/q/7106211/861716). –

Antwort

0

konnte ich mein eigenes Problem beheben, indem Sie den Code in meinem Update-Methode auf diese Neuanordnung:

context.FormData.Attach(sampleFormClass); 

var entry = context.Entry(sampleFormClass); 
entry.State = System.Data.Entity.EntityState.Modified; 
entry.Property(e => e.Items).IsModified = false; 

foreach (var navigationProperty in myTestClass.Test) 
{ 
     var entityEntry = context.Entry(navigationProperty); 
     entityEntry.State = System.Data.Entity.EntityState.Modified; 
     entityEntry.Property(navProp => navProp.SampleClassId).IsModified = false; 
} 


} 
context.SaveChanges(); 

Ich zog die Linie, wo Sie das Objekt befestigen Sie über alles andere aktualisieren gehen.

Verwandte Themen