0

我正在使用实体框架,我有两个表,一个联系关系表和一个联系表。该关系是对一个联系人的许多联系人关系。

在下面的代码中,我试图获取联系人关系,然后获取相关的联系人,但是下面的代码始终为联系人返回 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); 
    }

但是,如果我添加一条首先进入数据库并加载联系人的行,那么联系人关系将起作用:

    [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 值是正确的,所有数据都存在。

4

1 回答 1

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 在加载/附加的实体之间自动建立关系。在您的第一个代码片段中情况并非如此。

于 2012-06-12T11:33:11.950 回答