1

私は過去 2 日間、EF の多対多の関係を理解し​​ようとしてきましたが、ここでさまざまな質問を精査した後でも、まだ何かが欠けています。

Text任意の数のモデルを関連付けることができるという名前のモデルがTagあります。明らかに、少なくとも理論的には、それぞれTagを任意の数のテキストに関連付けることができます。Entity Framework はこれを十分に理解しているようで、データベースに TextTags という名前のテーブルを作成するように要求しなくてText.Tagsも問題なくアクセスできますが、コードでアクセスしようとするとTag.Texts、null 参照例外が発生します。

ここで、すべてのテキストをすべてのタグに手動で追加することもできます (または、何らかのエラーが発生する可能性があります) が、それでは目的が果たされないように思われます... それに加えて、エラーが発生しやすいようです。私は何を理解できていないのですか?

要求されたコード:

テキスト モデル:

public class Text
{
    public int ID { get; set; }
    public Author Author { get; set; }
    public string Content { get; set; }
    public virtual ICollection<Tag> Tags { get; set; }
}

タグモデル:

public class Tag
{
    public int ID { get; set; }
    public string Name { get; set; }
    public ICollection<Text> Texts { get; set; }
}

データ挿入:

using (var db = new TextDbContext())
{
    db.Authors.Add(new Author()
    {
        Name = "Poe"
    });

    db.Tags.Add(new Tag() { Name = "lame" });
    db.Tags.Add(new Tag() { Name = "example" });

    db.SaveChanges();

    db.Texts.Add(new Text()
    {
        Author = db.Authors.First(),
        Tags = db.Tags.ToList(),
        Content = "This is the first text by Poe."
    });

    db.Texts.Add(new Text()
    {
        Author = db.Authors.First(),
        Tags = db.Tags.ToList(),
        Content = "This is the second text by Poe."
    });

    db.Texts.Add(new Text()
    {
        Author = db.Authors.First(),
        Tags = db.Tags.ToList(),
        Content = "This is the third text by Poe."
    });

    db.SaveChanges();
}

エラー:

foreach (var tag in db.Tags)
{
    foreach (var text in tag.Texts)
    {
        Console.WriteLine("Tag: {0}\tText: {1}", tag.Name, text.Content);
        // Null reference on line above.
    }
}
4

1 に答える 1