我是Entity Framework的新手。我正在使用代码优先选项。下面我有一个基本模型。数据库是正确创建的,并且记录保持正确,但是当我第二次运行测试方法(在模型之后定义)时,我的标题记录加载正常,但我的导航属性Details不会重新加载。我做错了什么?
class Header
{
public int HeaderId { get; set; }
public string Name { get; set; }
public virtual ICollection<Detail> Details { get; set; } = new List<Detail>();
}
class Detail
{
public int DetailId { get; set; }
public string Name { get; set; }
public int HeaderId { get; set; }
[ForeignKey("HeaderId")]
public virtual Header Header { get; set; }
}
class MyContext : DbContext
{
public MyContext() : base("EfTest")
{
this.Configuration.LazyLoadingEnabled = true;
}
public virtual DbSet<Header> Headers { get; set; }
}
private static void DoIt()
{
using (var ctx = new MyContext())
{
var hdr = (
from header in ctx.Headers
where header.Name == NAME
select header).FirstOrDefault();
if (hdr == null)
{
hdr = new Header();
hdr.Name = NAME;
ctx.Headers.Add(hdr);
MessageBox.Show("Header not found; created.");
}
else
{
MessageBox.Show("Header found!");
}
var det = hdr.Details.FirstOrDefault();
if (det == null)
{
det = new Detail() { Name = "Hi" };
hdr.Details.Add(det);
MessageBox.Show("Detail not found; created.");
}
else
{
MessageBox.Show("Detail found!");
}
ctx.SaveChanges();
}
}
答案 0 :(得分:1)
此处实体框架使用Lazy-Loading
。为了获取详细信息,您应该使用Eager-Loading
。您应该在Include
命名空间中使用System.Data.Entity
方法来完成Eager-Loading
。更改您的查询,如下所示。
var hdr = (
from header in ctx.Headers
where header.Name == NAME
select header).Include(h=>h.Details).FirstOrDefault();