实体框架不会在SaveChanges上持久化复杂的实体更改

时间:2014-01-10 15:17:03

标签: c# entity-framework

更新:我是个白痴。一切都被持久化到磁盘,但@Html.EditorFor(x => ...)没有显示值。


在我调用db.SaveChanges();后,尽管已明确告知实体框架实例已更改为:

,但仍未更新复杂的Entity Framework对象的非虚拟子属性
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();
}

为什么我的复杂对象的非虚拟子属性值未被保存?更令人费解的是,其中一个简单的“步骤”对象是持久存储到磁盘,但大多数都没有。

1 个答案:

答案 0 :(得分: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();