1

在过去的两天里,我一直在尝试了解 EF 多对多关系,即使在这里搜索了十几个不同的问题后,我仍然遗漏了一些东西。

我有一个名为的模型Text,它可以与任意数量的Tag模型相关联,显然,至少在理论上,每个模型Tag都可以与任意数量的文本相关联。Entity Framework 似乎很好地理解了这一点,无需我要求它就可以在数据库中创建一个名为 TextTags 的表,而且我可以Text.Tags毫无问题地访问,但是当我尝试Tag.Texts在我的代码中访问时,我得到一个空引用异常。

现在,我可以手动将每个文本添加到每个标签(或者我可以吗?这似乎会引发某种错误),但这似乎违背了目的......除此之外,它似乎也容易出错。我不明白什么?

要求的代码:

文字模型:

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

4

您得到 aNullReferenceException因为您的导航属性Tag.Texts未标记为virtual。因此,Tag.Texts当您访问它并且集合是null. (Text.Tags virtual,因此这里也不例外。)

于 2013-08-09T20:33:39.350 回答