在实体框架中映射关系

时间:2012-06-12 11:07:29

标签: .net entity-framework

我正在使用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值正确且所有数据都存在。

1 个答案:

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