使用Entity Framework 6,使用以下类和多对多“连接表”的DbContext配置,正在进行更改,但是没有创建任何ChangeTracker条目。为了记录目的而点击了DbContext SaveChanges(),我希望能够记录对这个连接FooBar表的更改。
可能与此连接表的组合有关,在我的DbContext中没有实际的POCO类和DbSet,和/或ChangeTracker如何仅跟踪标量属性。
public class Foo
{
[Key]
public long FooId { get; set; }
public virtual ICollection<Bar> Bars { get; set; }
}
public class Bar
{
[Key]
public long BarId { get; set; }
public virtual ICollection<Foo> Foos { get; set; }
}
DbContext配置:
protected override void OnModelCreating(DbModelBuilder modelBuilder)
{
modelBuilder.Entity<Foo>()
.HasMany(foo => foo.Bars)
.WithMany(bar => bar.Foos)
.Map(x =>
{
x.MapLeftKey("FooId");
x.MapRightKey("BarId");
x.ToTable("FooBar");
})
.MapToStoredProcedures();
modelBuilder.Entity<Bar>().MapToStoredProcedures();
}
如果我有一个现有的Foo“foo”,一堆Bars,并对“foo.Bars”集合进行更改以将这些Bars链接到我的Foo。 SaveChanges()正在为FooBar表中的添加和删除完美地保存更改,但是“foo”实体在ChangeTracker中设置为EntityState.Unmodified。如果我手动将其设置为EntityState.Modified,则更改会像之前一样持久化,但它并没有真正帮助我,因为我需要将更改记录到Foo.Bars集合中。在添加全新的Foo并填充Bars集合时,不会添加额外的ChangeTracker记录来跟踪添加的FooBar记录。
我尝试的另一个模糊的东西是来自Programming DbContext的书,试图使用ObjectContext.ObjectStateManager来设置一个手动修改的关系。
((IObjectContextAdapter) PulseContext).ObjectContext
.ObjectStateManager
.ChangeRelationshipState(
foo,
foo.Bars,
x => x.Bars,
EntityState.Modified);
类似于我发现的一个例子,虽然这可能会将整个“Foo.Bars”集合设置为Modified(如果支持EF这样的话)......我真的想要获得单独的ChangeTracker记录对于Foo.Bars中包含的每个FooBar,如果有任何意义的话。在任何情况下,上述尝试都给我带来了这个错误:
The ObjectStateManager does not contain an ObjectStateEntry with a reference to an object of type 'System.Collections.Generic.HashSet`1[[XYZ.Foo.Bar, XYZ.Foo, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null]]'.
也许我不能在没有具体的FooBar类的情况下获得FooBar ChangeTracker条目,并在我的DbContext中为它创建一个DbSet,这对于一个简单的连接表来说似乎有些过分,并且可能会使我对foo的foo添加/删除Bars变得复杂.Bars。我确实有一些其他的一对多表,它们有自己的DbSets,正好是ChangeTracked。
干杯!
答案 0 :(得分:1)
DB上下文的更改跟踪器仅保存有关已更改实体的信息,而不保留已更改关系的信息。
在尝试使用ObjectStateManager
时,你是在正确的方式,有人成功地做了它:
Entity Framework 4.1+ many-to-many relationships change tracking