2012-06-12 230 views
0

我正在使用實體框架,我有兩個表,一個聯繫關係表和一個聯繫表。這種關係與一個聯繫人有很多聯繫關係。實體框架中的映射關係

在下面的代碼中,我試圖獲取聯繫人關係,然後獲取相關的聯繫人,但下面的代碼始終爲聯繫人返回空值。

[Test] 
    public void Mapping_ContactRelationshipsToContacts() 
    { 
     //Assign 
     Guid id = new Guid("118a0d24-cf9d-e111-802d-005056b4000d"); 

     //Act    
     var result = _db.ContactRelationships.Where(x => x.Id == id).FirstOrDefault().Contact; 

     //Assert 
     Assert.IsNotNull(result); 
    } 

但是如果我添加一行去到DB頭和加載聯繫然後聯繫關係的工作:那我不使用新的變量

[Test] 
    public void Mapping_ContactRelationshipsToContacts() 
    { 
     //Assign 
     Guid id = new Guid("118a0d24-cf9d-e111-802d-005056b4000d"); 

     //Act 
     var notUsed = _db.Contacts.Where(x => x.Id == new Guid("B2A2AB8C-238E-E111-8BF0-005056B4000D")).FirstOrDefault(); 
     var result = _db.ContactRelationships.Where(x => x.Id == id).FirstOrDefault().Contact; 

     //Assert 
     Assert.IsNotNull(result); 
    } 

通知,所有我做的確保它在數據庫中。任何人都知道是什麼原因導致此行爲我的關係的映射是:

 modelBuilder.Entity<ContactRelationship>().HasOptional(x => x.Contact) 
     .WithMany(o => o.ContactRelationships).HasForeignKey(x => x.ContactID); 

我已檢查並且ID值正確且所有數據都存在。

回答

1

您必須讓你的導航屬性virtual讓懶加載...

public class ContactRelationship 
{ 
    //... 
    public virtual Contact Contact { get; set; } 
    //... 
} 

...或者你必須渴望負荷的導航屬性使用Include

var result = _db.ContactRelationships.Include(cr => cr.Contact) 
    .Where(x => x.Id == id).FirstOrDefault().Contact; 

你的第二個代碼代碼片段可以工作,因爲Contact在從數據庫加載後已經附加到上下文,並且因爲EF會在加載/附加的實體之間自動建立關係。在你的第一個代碼片段中情況並非如此。