2

我正在 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; }
}

运行它的输出是:

上下文懒惰真。代理创建 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)。

4

3 回答 3

4

代理生成没有发生。为什么??因为您的 POCO 是私人的!EF 看不到它们以从中派生代理。公开您的 POCO,它会按您期望的方式工作。

public class Group
于 2013-03-27T14:42:23.567 回答
0

您是否使用任何东西来配置 2 个类之间的 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; } 
}
于 2013-03-25T20:54:41.133 回答
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;}

将下一行添加到您OnModelCreatingModels.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。

于 2013-03-25T21:10:00.647 回答