我正在使用Entity Framework,我有两个表,一个联系人关系表和一个联系人表。这种关系是与一个联系人的许多联系关系。
在下面的代码中,我尝试获取联系人关系,然后获取相关联系人,但下面的代码始终为联系人返回null。
[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值正确且所有数据都存在。
答案 0 :(得分: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在加载/附加的实体之间自动建立关系。在您的第一个代码段中并非如此。