2014-01-10 80 views
1

更新:我當時是一個白癡。一切都被堅持到磁盤,但@Html.EditorFor(x => ...)沒有顯示值。在實體實體框架不會在SaveChanges上持續複雜的實體更改

db.Entry(myComplexEntity).State = System.Data.Entity.EntityState.Modified; 

平性質:


一個複雜的實體框架對象的非虛擬子屬性我打電話db.SaveChanges();儘管明確地告訴實體框架的實例已與改變後未更新正在更新,但對象內部沒有(非虛擬)對象,例如在Step1值:

public class Wizard 
{ 
    [Key] 
    public Guid WizardId { get; set; } 

    public DateTime CreatedOn { get; set; } 

    public Step1 Step1 { get; set; } 
    // ... 
    public Step5 Step5 { get; set; } 

    public Wizard() 
    { 
     Step1 = new Step1(); 
     // ... 
     Step5 = new Step5(); 
    } 
} 

我在input證實值被正確綁定,但儘管被明確設置的值不會被保存到數據庫中。下面是我設置的值:

using (var db = new MyDataContext()) 
{ 
    wizard = db.Wizards.First(x => x.WizardId == id); 

    wizard.UpdatedOn = DateTime.Now; // this is being saved to the DB 

    // The following properties are not persisted to the database: 
    wizard.Step1.Capacity = input.Capacity; 
    wizard.Step1.Color = input.Color; 
    wizard.Step1.Conditions = input.Conditions; 
    wizard.Step1.SerialNumber = input.SerialNumber; 
    wizard.Step1.Model = input.Model; 

    db.Entry(wizard).State = System.Data.Entity.EntityState.Modified; 

    db.SaveChanges(); 
} 

爲什麼我的複雜對象的非虛擬子屬性的值未保存?更令人費解的是,其中一個簡單的「步驟」對象是堅持到磁盤,但大多數不是。

+0

我認爲你首先使用代碼?數據庫表是什麼樣的?這些步驟是否標記爲「[ComplexType]」? – flindeberg

+0

當你檢索'wizard'時,你需要包含'Step1',或者使其成爲'virtual',以便它被延遲加載。否則上下文不知道它,並且不能檢測到應該保存的任何更改 – Colin

回答

0

你應該改變

public Step1 Step1 { get; set; } 

對此(以創建模型中的外鍵):

public int Step1Id {get;set;} 
public virtual Step1 Step1 { get; set; } 

而且我一直用這樣的:

Step1 s1 = new Step1(); 
// ... assign values here ... 
db.Step1s.Add(s1); 
db.SaveChanges(); 

wizard.Step1Id = s1.Id; 
db.SaveChanges();