2014-01-10 3 views
1

Обновление: Я был идиотом. Все было сохранено на диске, но @Html.EditorFor(x => ...) не показывал значения.Entity Framework не сохраняет сложные сущностные изменения на SaveChanges


невиртуальных подсвойств сложное образование Framework объекта не обновляется после того как я называю db.SaveChanges();, несмотря на явно говоря рамки Entity, что экземпляр был изменен с:

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

плоских свойств в объекте обновляются, но ни один из (не виртуальных) объектов внутри объекта, например, значения в 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

Вам нужно включить 'Step1', когда вы извлекаете« волшебник », или делаете его« виртуальным », чтобы он был ленивым. В противном случае контекст не знает об этом и не может обнаружить никаких изменений, которые должны быть сохранены – 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(); 
Смежные вопросы