延迟加载EntityFramework 5(带CodeFirst)
本文关键字:CodeFirst EntityFramework 延迟加载 | 更新日期: 2023-09-27 18:06:01
我正在测试c#控制台应用程序中的延迟加载。由于某些原因,延迟加载不工作。
我已经检查了context.Configuration的LazyLoadingEnabled
和ProxyCreationEnabled
属性。
我的属性是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)
代理未生成。为什么? ?因为你的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。