C# &引用;ObjectContext可能处于不一致的状态;更新已加载的导航属性后

C# &引用;ObjectContext可能处于不一致的状态;更新已加载的导航属性后,c#,entity-framework,ninject,entity-framework-6,navigation-properties,C#,Entity Framework,Ninject,Entity Framework 6,Navigation Properties,我使用的是实体框架6和Ninject。我通过父属性的存储库加载父属性,该存储库使用即时加载来填充子属性,并尝试通过更改Id来更新此子属性。在代码的其他地方,EF正确地指出,当更新此Id时,关联的导航属性也需要更新 例如 …我没有收到错误,但是数据库中的属性实际上没有更改 有没有想过为什么会发生这种情况,或者有没有正确的方法来进行这种更改?在我看来,您正在更改外键(Foo.subfood),而没有将Subfoo.Id更新为相同的值。我很确定你不应该真的改变外键。通常,您甚至不需要将外键作为Foo上

我使用的是实体框架6和Ninject。我通过父属性的存储库加载父属性,该存储库使用即时加载来填充子属性,并尝试通过更改Id来更新此子属性。在代码的其他地方,EF正确地指出,当更新此Id时,关联的导航属性也需要更新

例如

…我没有收到错误,但是数据库中的属性实际上没有更改


有没有想过为什么会发生这种情况,或者有没有正确的方法来进行这种更改?

在我看来,您正在更改外键(
Foo.subfood
),而没有将
Subfoo.Id
更新为相同的值。我很确定你不应该真的改变外键。通常,您甚至不需要将外键作为
Foo
上的可访问属性。该引用由表单的
Foo.subfo
属性维护。至少我这么认为,我不知道EF,只知道其他ORM。如果/当你解决了这个问题时,你能给出反馈吗?我尝试了更新外键和/或可访问属性本身的所有不同组合,但都不起作用。我能做的唯一一件事就是从FooRepository调用中删除急切的加载。
public class Foo
{
   public int SubFooId { get; set; }

   //Navigation Properties:

   [JsonIgnore]
   public virtual Subfoo Subfoo { get; set; }
}

//Uses eager loading [ .Include("Subfoo") ] to populate Subfoo
var foo = container.Get<FooRepository>().FindByIdUseEagerLoad(1);

foo.SubFooId = 2;

container.Get<FooRepository>().Write(foo);
container.Get<MyContext>().CommitToDatabase();
var newFoo = new Foo() { ... };
foo = newFoo;