延迟加载EntityFramework 5(使用CodeFirst)

时间:2013-03-25 20:46:13

标签: c# entity-framework

我正在测试C#控制台应用程序中的延迟加载。由于某种原因,懒惰加载不起作用。

我检查了context.Configuration的LazyLoadingEnabledProxyCreationEnabled属性。他们是真的。

我的属性是虚拟

我检查了其他类似的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。代理创建真实

     

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

     

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

我确信加载的记录是正确的,并且数据库中有正确的AttrSet

有什么想法吗?

更新

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

请参阅:https://bitbucket.org/josea/eflazy(GIT:https://josea@bitbucket.org/josea/eflazy.git)。

3 个答案:

答案 0 :(得分:4)

代理生成没有发生。为什么??因为你的POCO是私人!! EF无法看到它们从中获取代理。让您的POCO公开,它将以您期望的方式运作。

public class Group

答案 1 :(得分:0)

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

您可以使用数据注释来定义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; } 
}

答案 2 :(得分:0)

这应该给你你想要的关系。 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;}

将下一行添加到OnModelCreating中的Models.DataContext。如果由于某种原因你还没有覆盖该功能,它将如下所示:

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。