繁体   English   中英

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

[英]EF6 Many-to-Many changes saving but not creating ChangeTracker entries

使用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”,则有一些Bar,然后对“ foo.Bars”集合进行更改以将这些Bar链接到我的Foo。 SaveChanges()可以完美地将更改保存为FooBar表中的添加和删除,但“ foo”实体设置为EntityState.ChangeChangeer中未修改。 如果我手动将其设置为EntityState.Modified,则更改将像以前一样持久保存,但对我没有帮助,因为我需要将更改记录到Foo.Bars集合中。 在添加带有Bars集合的全新Foo时,也不会添加任何额外的ChangeTracker记录来跟踪添加的FooBar记录。

我尝试过的另一件晦涩的事情是那本《编程DbContext》书中的东西,它试图使用ObjectContext.ObjectStateManager设置要手动修改的关系。

((IObjectContextAdapter) PulseContext).ObjectContext
    .ObjectStateManager
    .ChangeRelationshipState(
        foo,
        foo.Bars,
        x => x.Bars,
        EntityState.Modified);

与我发现的示例类似,尽管这可能会将整个“ Foo.Bars”集合设置为“已修改”(如果这是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类并在我的DbContext中为其创建DbSet的情况下,我真的无法真正获得FooBar ChangeTracker条目,这对于简单的连接表来说似乎有点多余,并且可能会使我在foo的foo.Bars中添加/删除Bar变得复杂。 我还有一些其他的一对多表,它们确实有自己的DbSet,可以很好地进行ChangeTracked。

干杯!

数据库上下文的更改跟踪器仅保存有关更改的实体的信息,而不包含有关更改的关系的信息。

尝试使用ObjectStateManager ,您的方法正确,并且有人成功完成了它:

实体框架4.1+多对多关系更改跟踪

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM