如何更新 entity framework 中的导航属性?

How do you update navigation properties in entity framework?

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

我有两个 classes:

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

另一个 class 看起来像这样:

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,那么它不会更新我的导航 属性。如何同时更新我的​​对象及其对象列表?

解决我的问题

编辑:我能够通过将更新方法中的代码重新排列为以下内容来解决我自己的问题:

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

我只是将您要附加要更新的对象的行移到了其他所有内容之上。

我可以通过将更新方法中的代码重新排列为以下内容来解决我自己的问题:

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

我只是将您要附加要更新的对象的行移到了其他所有内容之上。