多对多关系不是双向的?

时间:2013-08-09 15:31:00

标签: entity-framework many-to-many

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

我有一个名为Text的模型可以拥有与之关联的任意数量的Tag模型,显然,至少在理论上,每个Tag都可以与任意数量的文本。实体框架似乎很好地理解这一点,在数据库中创建一个名为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.
    }
}

1 个答案:

答案 0 :(得分:4)

您收到NullReferenceException,因为您的导航属性Tag.Texts未标记为virtual。因此,当您访问Tag.Texts集合并且集合为null时,延迟加载无法加载Text.Tags集合。 (virtual {{1}},因此此处不例外。)