【发布时间】:2016-06-17 16:39:04
【问题描述】:
我正在尝试同时更新数据库中的两个对象。使用我当前的代码,它似乎只会更新我的导航属性。例如,如果我的第一堂课中的“分数”发生变化,它将不会被更新。但是,如果第二类中的任何内容发生更改,它将正确更新。我不确定我在这里做错了什么。这是代码优先的实体框架。
我有两个班级:
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 来更新对象,那么它不会更新我的导航属性。如何同时更新我的对象及其对象列表?
我的问题的解决方案
编辑:我可以通过将更新方法中的代码重新排列为以下内容来解决我自己的问题:
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();
我刚刚将您附加要更新的对象的行移到其他所有内容之上。
【问题讨论】:
-
我不明白为什么人们继续手动更改实体状态。肯定有一些非常糟糕的教程,人们一直在关注。只需更改您要更改的属性并致电
SaveChanges,EF 将负责其余的工作。 How to update record using Entity Framework 6? 的可能重复项 -
@CraigW。因为在许多情况下,这将阻止到数据库的往返。这可能有道理,也可能没有道理,It depends。
标签: c# entity-framework code-first