2016-07-08 10 views
1

Ich versuche, einen Datenbankeintrag mit Entity Framework zu aktualisieren. Die Einheiten sind wie folgt:Versuch, die Datenbank mithilfe von Entity Framework Code zu aktualisieren Zuerst

public partial class Test 
{ 
    [Key] 
    [DatabaseGenerated(DatabaseGeneratedOption.Identity)] 
    public Guid identity { get; set; } 
    public string Name { get; set; } 
    public int Age { get; set; } 
    public TestRef Colour { get; set; } 
} 

public class TestRef 
{ 
    public int id { get; set; } 
    public string favColor { get; set; } 
} 

und bearbeitet Action in dem entsprechenden Controller ist wie folgt:

public ActionResult Edit([Bind(Include = "identity,Name,Age,Colour")] Test test) 
{ 
    if (ModelState.IsValid) 
    { 
     test.Colour = db.TestRefs.Find(test.Colour.id); 
     db.Tests.Attach(test); 
     db.Entry(test).State = EntityState.Modified; 
     db.SaveChanges(); 
     return RedirectToAction("Index"); 
    } 
    return View(test); 
} 

Also hier, Edit scheint mit Ausnahme Farbe für alle Eigenschaften in Test zu arbeiten (in dass alle anderen Eigenschaften aktualisiert werden, aber die Farbe unverändert bleibt, ohne Änderung). Ich nehme an, das ist, weil es eine Assoziation ist, aber ich kann nicht für das Leben von mir herausfinden, warum.

+0

Sie müssen genauer sein, was nicht funktioniert. Ist die Color-Eigenschaft für die Anforderung korrekt gebunden? Ist die Color-Eigenschaft nicht in der Datenbank festgelegt? Versucht der TestRef, diesen Test zu verknüpfen, bereits in der Datenbank vorhanden zu sein? Gib uns bitte Details. – Jakotheshadows

+0

Die Color-Eigenschaft ist verbindlich, aber nicht in der Datenbank festgelegt. Auch die TestRefs existieren bereits in der Datenbank. – ASMoncrieff

Antwort

3

Zuerst EF sagen, dass TestRef haben einen Schlüssel:

public class TestRef 
{ 
    [Key] /* <--- */ 
    /*[DatabaseGenerated(???)] Does value generated by database? */ 
    public int id { get; set; } 
    public string favColor { get; set; } 
} 

Zweitens verweist ein Fremdschlüssel sein:

public partial class Test 
{ 
    [Key] 
    [DatabaseGenerated(DatabaseGeneratedOption.Identity)] 
    public Guid identity { get; set; } 
    public string Name { get; set; } 
    public int Age { get; set; } 

    [ForeignKey("TestRefID")] /* <--- */ 
    public TestRef Colour { get; set; } 
} 

Namen TestRefID oben im Code nur Beispiel. Geben Sie dort den Namen der FK-Spalte aus Ihrer Datenbank ein. Sie haben FK-Spalte in der Datenbank für diese Beziehung, nicht wahr?

Auch, wenn Sie verzögertes Laden benötigen, machen Colour Eigenschaft virtual:

... 
    [ForeignKey("TestRefID")] 
    public virtual TestRef Colour { get; set; } 
... 

EF eine direved Art machen und für alle virtuellen Referenzobjekte wird es faul Ladelogik implementieren. Es ist das Standardverhalten, bis Sie es in db Kontexteinstellungen deaktivieren:

yourDataContext.ContextOptions.LazyLoadingEnabled = false; 

By the way, es ist keine gute Idee, GUID als Primärschlüssel zu verwenden. Look here für Nachteile und Profis.

+0

Danke dafür, ich werde es versuchen. – ASMoncrieff

+0

Perfekt, das funktioniert, danke! – ASMoncrieff