延迟加载EntityFramework 5(带CodeFirst)

本文关键字:CodeFirst EntityFramework 延迟加载 | 更新日期: 2023-09-27 18:06:01

我正在测试c#控制台应用程序中的延迟加载。由于某些原因,延迟加载不工作。

我已经检查了context.Configuration的LazyLoadingEnabledProxyCreationEnabled属性。

我的属性是virtual

我检查了其他类似的SO问题,没有成功。我不确定会发生什么。

这是我的代码(简化为不显示名称空间):

static void Main(string[] args) {
    Models.DataContext dc = new Models.DataContext();
    Console.WriteLine("Context Lazy {0}. Proxy Creation {1} ", 
                       dc.Configuration.LazyLoadingEnabled,
                       dc.Configuration.ProxyCreationEnabled);
    var grp = dc.Groups.FirstOrDefault();     
    Console.WriteLine("GroupId {1}, AttrSet is null = {0}", 
                       grp.AttrSet == null , grp.Id); 
    var grp2 = dc.Groups.Include("AttrSet").FirstOrDefault();
    Console.WriteLine("GroupId {1}, AttrSet is null = {0}", 
                              grp2.AttrSet == null, grp2.Id); 
}
class Group  {
    public System.Guid Id { get; set; }
    public string Name { get; set; }
    public virtual AttrSet AttrSet { get; set; }
 }
class AttrSet {
    public System.Guid Id { get; set; }
    public string Name { get; set; }
}

运行这个命令的输出是:

Context Lazy True。代理创建True

GroupId 186ebc8a-dec7-4302-9f84-5a575577baac, AttrSet is null = True

GroupId 186ebc8a-dec7-4302-9f84-5a575577baac, AttrSet is null = False

我确信加载的记录是正确的,它在数据库中有一个适当的AttrSet

任何想法?

我创建了一个非常简单的测试项目,以防有人想要查看代码。

参见:https://bitbucket.org/josea/eflazy (GIT: https://josea@bitbucket.org/josea/eflazy.git)

延迟加载EntityFramework 5(带CodeFirst)

代理未生成。为什么? ?因为你的POCOs是私人的!!EF不能看到它们并从中派生代理。让你的poco公开,它会按你期望的方式工作。

public class Group

您是否使用任何东西来配置两个类之间的1:1关系?因为它看起来不像你在这里,这会导致实体框架无法加载关系。

您可以使用数据注释来定义FK关系,如下所示:

public class AttrSet {
  public System.Guid Id { get; set; }
  public string Name { get; set; }
  [Required, ForeignKey("MyGroup")]
  public int GroupID { get; set; }
  public virtual Group MyGroup { get; set; } 
}

这将给出您想要的关系。AttrSetId是您在表中为FK列命名的任何名称,因此,如果它不同,请更改它。

public class Group  {
         public System.Guid Id { get; set; }
         public string Name { get; set; }
         public System.Guid AttrSetId {get;set;}         
         [ForeignKey("AttrSetId")]
         public virtual AttrSet AttrSet { get; set; }
 }
编辑:

将这一行添加到您的AttrSet类中:

public virtual ICollection<Group> Groups {get;set;}

将下一行添加到Models.DataContext中的OnModelCreating。如果由于某种原因,您还没有覆盖该函数,它将看起来像这样:

protected override void OnModelCreating(DbModelBuilder modelBuilder)
{
    base.OnModelCreating(modelBuilder);
    modelBuilder.Entity<Group>().HasOptional(x => x.AttrSet).WithMany(x => x.Groups);
}

我把HasOptional而不是HasRequired,因为我认为你可以保存一个没有AttrSet的组。如果这不是真的,并且FK不可为空,那么您应该使用HasRequired。