如何更新实体框架中的导航属性?

时间:2016-06-17 16:39:04

标签: c# entity-framework code-first

我正在尝试同时更新数据库中的两个对象。使用我目前的代码,它似乎只是更新我的导航属性。例如,如果"得分"在我的第一堂课中,它不会更新。但是如果第二类中的任何内容发生变化,它将会正确更新。我不确定我在这里做错了什么。这是代码优先的实体框架。

我有两个班级:

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; }
}

另一个看起来像这样的课程:

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; }
}

要在数据库中更新我有:

    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();

如果我在我的方法中删除了foreach以更新对象,那么它将不会更新我的nav属性。如何同时更新我的​​对象及其对象列表?

解决我的问题

修改:我可以通过重新安排更新方法中的代码来解决自己的问题:

    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();

我刚刚移动了您要更新的对象所在的行。

1 个答案:

答案 0 :(得分:0)

我能够通过将更新方法中的代码重新排列到此来解决我自己的问题:

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();

我刚刚移动了您要更新的对象所在的行。