gpt4 book ai didi

c# - Entity Framework 多对多不填充集合

转载 作者:太空宇宙 更新时间:2023-11-03 13:32:49 25 4
gpt4 key购买 nike

我有两个 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;)。原始问题中描述的“自动收集填充”功能称为“延迟加载”,它需要启用代理创建。 This MSDN article有更多信息。

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

关于c# - Entity Framework 多对多不填充集合,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19914229/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com