过去两天我一直试图与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.
}
}
答案 0 :(得分:4)
您收到NullReferenceException
,因为您的导航属性Tag.Texts
未标记为virtual
。因此,当您访问Tag.Texts
集合并且集合为null
时,延迟加载无法加载Text.Tags
集合。 (virtual
是 {{1}},因此此处不例外。)