【问题标题】:Entity Framework many-to-many not populating collections实体框架多对多不填充集合
【发布时间】:2013-11-11 19:25:42
【问题描述】:

我有两个 POCO 类,每个都包含另一个的集合。我正在尝试在这些类之间配置多对多关系。但是,当我加载上下文时,EF 不会填充每个对象的任何集合。这怎么能自动完成?

public class POCO1
{
    public int ID { get; set; }
    public virtual ICollection<POCO2> POCO2s { get; set; }
}

public class PCOO2
{
    public int ID { get; set; }
    public virtual ICollection<POCO1> POCO1s { get; set; }        
}

public class POCOContext : DbContext
{
    public DbSet<POCO1> POCO1s { get; set; }
    public DbSet<POCO2> POCO2s { get; set; }

    modelBuilder.Entity<POCO1>()
        .HasKey(p => p.ID);

    modelBuilder.Entity<POCO1>()
        .HasMany(p => p.POCO2s).WithMany(p => p.POCO1s);

    modelBuilder.Entity<POCO2>()
        .HasKey(p => p.ID);

    modelBuilder.Entity<POCO2>()
        .HasMany(p => p.POCO1s).WithMany(p => p.POCO2s);
}

public class Test
{
    static void Main(string[] args)
    {
        using (var context = new POCOContext())
        {
            context.Database.Initialize(true);
            var p1 = context.POCO1s.Create();
            var p2 = context.POCO2s.Create();
            p1.POCO2s.Add(p2);
            p2.POCO1s.Add(p1);
            context.saveChanges();
        }

        // reload context from db
        using (var context = new POCOContext())
        {
            context.POCO1s.ToList()[0].POCO2s.Count();    // == 0, but should be 1
            context.POCO2s.ToList()[0].POCO1s.Count();    // == 0, but should be 1
        }
    }
}

编辑以包含更多信息:根据我所阅读的内容,不需要包含注释甚至使用 Fluent API 指定键,并且使用这些约定 EF 5.0 应该正确配置关系。确实如此,因为首先使用代码正确构建了数据库表(有一个 POCO1 表、一个 POCO2 表和一个交集表,所有这些表都在测试期间正确填充)。问题是当读取数据时,它似乎没有填充多对多关系。 SO 和各种教程和 MSDN 文档上的其他帖子建议使用正确的约定、延迟加载和虚拟集合应该可以工作,但这不是我看到的行为。

【问题讨论】:

    标签: c# .net ef-code-first entity-framework-5 many-to-many


    【解决方案1】:

    在我的情况下,问题是由于在我的实际代码中禁用了上下文(即context.Configuration.ProxyCreationEnabled = false;)上的代理创建。原始问题中描述的“自动收集填充”功能称为“延迟加载”,它需要启用代理创建。 This MSDN article 有更多信息。

    此外,如原始问题中所述,此功能按约定工作,无需指定键或关系(使用注释或流式 API)。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2012-09-23
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-03-06
      • 2018-09-27
      • 1970-01-01
      相关资源
      最近更新 更多