使用EF5和Code First延迟加载问题

时间:2013-03-19 14:42:03

标签: entity-framework ef-code-first lazy-loading ef-database-first

似乎延迟加载与代码优先不同,与db-first相同:

考虑:

public class Project
{
    [Key]
    public long ProjectId { get; set; }

    [Required]
    [MaxLength(60)]
    public virtual string Name { get; set; }
}

public class TestCase
{
    [Key]
    public long TestCaseId { get; set; }

    [Required]
    [ForeignKey("ProjectId")]
    public virtual Project Project { get; set; }
    public virtual long ProjectId { get; set; }
}

在这个DbContext中:

public class TestDbContext : DbContext
{
    public TestDbContext() : base("TestIckle") 
    {
    }

    public DbSet<Project> Projects { get; set; }
    public DbSet<TestCase> TestCases { get; set; }
}

当我在我的代码中尝试使用它时,它不起作用:

    Console.WriteLine(_db.Configuration.LazyLoadingEnabled); //prints true
TestDbContext _db = new TestDbContext();
var testcase = _db.TestCases.Create();
testcase.Project = _db.Projects.Find(7);

//the following line outputs 0 with Code-First
//the following line outputs 7 with DB-First
Console.WriteLine(testcase.ProjectId);

代码优先模型的能力是否低于db-first?似乎很奇怪我会为它分配导航属性和pkey,这让我觉得我配置错了。

以下是否应该有效?

var x = _db.TestCases.Create();
x.ProjectId = 7;
Console.WriteLine(x.Project.Name); //this never seems to work

很好,因为x知道它附加了哪个上下文,我本以为它可以处理这种情况。

感谢。

1 个答案:

答案 0 :(得分:0)

在最后两个示例中,Entity Framework未加载这些实体,因为您尚未将这些关系提交到数据库。当您分配了导航属性时,它不会自动填充FK ID,也不会在您完成所有操作后设置ID来填充导航属性。

实体框架足够聪明,要知道当您分配给其中任何一个属性(即ID或导航属性)时,它将在以后为两个属性填充正确的值。但在进行任何实际提交之前,它不会知道自动填充该值。如果你想一想,他们也不应该这样做:如果页面上的下拉列表映射到其中一个属性会发生什么?用户每次单击它都必须进行数据库调用才能正确保持映射。这可能会转化为更慢,更易破解的应用程序。