0

似乎延迟加载与代码优先的工作方式不同,因为它与 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 优先模型?我会为它分配 nav 属性和 pkey 似乎很奇怪,这让我觉得我的配置有误。

以下应该工作吗?

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

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

谢谢。

4

1 回答 1

0

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

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

于 2013-03-19T15:25:41.400 回答