我在使用EF 4.1和多对多关系时遇到问题。我决定使用数据库第一种方法(尽管我在代码第一种方法时遇到了同样的问题),并且我创建了一个数据库模型:
我在图片和标签表之间有很多关系。在数据库中,它被创建为一个名为“PictureTag”的新表,其中包含“Picture_Id”和“Tag_Id”字段。
我使用以下代码将数据添加到我的数据库:
if (tags != null)
{
foreach (HtmlNode tagNode in tags)
{
string tagString = tagNode.InnerText.Remove(0, 1);
Tag tag;
if (db.Tags.Any(q => q.TagName == tagString))
{
tag = db.Tags.Single(q => q.TagName == tagString);
}
else
{
tag = new Tag { TagName = tagString };
}
pic.Tags.Add(tag);
}
}
List<DbEntityValidationResult> list = db.GetValidationErrors().ToList();
db.Pictures.Add(pic);
db.SaveChanges();
这当然只是我代码的一部分。它是我的Crawler函数的一部分。代码工作正常,不会产生任何错误,并且可以在单个DB上下文中工作。
完成此功能后,我可以在数据库中查看数据,图片标签表中的所有三个图片,标签和实体。
然而,当我尝试放置我的视图图片和与该图片对应的标签时,我看不到任何标签。就像没有任何图片有任何附加标签。我知道这不是真的,因为我在数据库中看到数据,所以我不知道出了什么问题......
这是我的观点代码:
@model IEnumerable<SikSolution.Picture>
@{
ViewBag.Title = "Index";
}
<h2>Index</h2>
@foreach (var item in Model)
{
<div>
<img src="@item.Link" alt="@item.Name" />
<br />
<span>
Tags: @foreach (var tag in item.Tags)
{
Html.Label(tag.TagName + ", ");
}
</span>
</div>
}
我真的不知道出了什么问题......我希望得到任何建议或指出我正确的方向。
谢谢!
答案 0 :(得分:2)
可能的解释是您不使用延迟加载,也没有加载Picture
集合,包括相关标签(急切加载)。它应该是这样的:
//...
var pictures = db.Pictures.Include("Tags") // or Include(p => p.Tags) in EF 4.1
.Where(...)
.ToList();
return View(pictures);