EF6多对多更改保存但不创建ChangeTracker条目

时间:2014-07-09 03:44:10

标签: c# entity-framework join many-to-many

使用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。

干杯!

1 个答案:

答案 0 :(得分:1)

DB上下文的更改跟踪器仅保存有关已更改实体的信息,而不保留已更改关系的信息。

在尝试使用ObjectStateManager时,你是在正确的方式,有人成功地做了它:

Entity Framework 4.1+ many-to-many relationships change tracking