0

看來,因爲它使用DB-第一做延遲加載不工作相同的代碼一:延遲加載的問題與EF5和代碼首先

考慮:

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知道它連接的是哪個上下文,我本以爲它可以處理這種情況。

謝謝。

+0

你能清理你的第四個例子嗎?我不確定你將如何從'testcase.Project'獲得0或7。 – IronMan84 2013-03-19 14:56:05

回答

0

在最後兩個例子中,實體框架沒有加載這些實體,因爲您尚未將這些關係提交給數據庫。當您分配了導航屬性時,它不會自動填充FK ID,也不會在完成所有操作後設置ID時填充導航屬性。

但是,實體框架足夠聰明,知道當您將這些屬性(即ID或導航屬性)分配給它時,它將爲這兩個屬性填充未來的正確值。但在你做任何實際的提交之前,它不知道自動填充該值。如果您仔細想想,也不應該這樣做:如果在映射到其中一個屬性的頁面上有一個下拉菜單,會發生什麼情況?每當用戶點擊它時,都需要進行數據庫調用才能正確保持映射。這可能會轉化爲更慢,更易破壞的應用程序。

+0

我同意你最後一個例子。進一步閱讀顯示,文檔爲_db.TestCase.Create()明確指出這個對象沒有附加到上下文......這似乎毫無意義,我可能只是做一個新的TestCase()。但是,清單#4有不同的結果,這取決於你是Code First還是DB First。但我認爲你最終回答了我的問題,這是預期的行爲。在我標記爲答案之前,請稍等一下。謝謝。 – sheamus 2013-03-19 15:32:58

+1

實際上,當你將實體添加到上下文時,而不是當你將它提交給數據庫時,關係更新http://stackoverflow.com/a/15221140/470005(請參見UPDATE部分) – 2013-03-19 15:34:29

+0

@lazyberezovsky,我立即糾正。謝謝! – IronMan84 2013-03-19 15:42:14