簡體   English   中英

實體框架多對多未填充集合

[英]Entity Framework many-to-many not populating collections

我有兩個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文檔都建議使用正確的約定,延遲加載和虛擬集合應該可以工作,但這不是我所看到的行為。

就我而言,問題是由於在我的實際代碼中在上下文上禁用了代理創建(即context.Configuration.ProxyCreationEnabled = false; )。 原始問題中描述的“自動收集填充”功能稱為“延遲加載”,它需要啟用代理創建。 此MSDN文章具有更多信息。

另外,如原始問題中所述,此功能按慣例工作,而無需指定鍵或關系(使用批注或流暢的API)。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM