0

Entity Frameworkを使用していますが、連絡先関係テーブルと連絡先テーブルの2つのテーブルがあります。関係は、1つの連絡先に対する多くの連絡先関係です。

以下のコードでは、連絡先の関係を取得してから関連する連絡先を取得しようとしていますが、以下のコードは常に連絡先に対して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);
    }

新しい変数を使用していないことに注意してください。私が行っているのは、それがDBにあることを確認することだけです。誰もがこの振る舞いの原因を知っていますか?関係のマッピングは次のとおりです。

        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;

2番目のコードスニペットContactは、データベースからロードした後にコンテキストに既にアタッチされており、EFがロード/アタッチされたエンティティ間の関係を自動的に確立するために機能します。これは、最初のコードスニペットには当てはまりません。

于 2012-06-12T11:33:11.950 に答える