我正在测试C#控制台应用程序中的延迟加载。由于某种原因,懒惰加载不起作用。
我检查了context.Configuration的LazyLoadingEnabled
和ProxyCreationEnabled
属性。他们是真的。
我的属性是虚拟。
我检查了其他类似的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)。
答案 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。