似乎延迟加载与代码优先不同,与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知道它附加了哪个上下文,我本以为它可以处理这种情况。
感谢。
答案 0 :(得分:0)
在最后两个示例中,Entity Framework未加载这些实体,因为您尚未将这些关系提交到数据库。当您分配了导航属性时,它不会自动填充FK ID,也不会在您完成所有操作后设置ID来填充导航属性。
实体框架足够聪明,要知道当您分配给其中任何一个属性(即ID或导航属性)时,它将在以后为两个属性填充正确的值。但在进行任何实际提交之前,它不会知道自动填充该值。如果你想一想,他们也不应该这样做:如果页面上的下拉列表映射到其中一个属性会发生什么?用户每次单击它都必须进行数据库调用才能正确保持映射。这可能会转化为更慢,更易破解的应用程序。