实体框架多对多关系不起作用

时间:2011-10-04 11:28:27

标签: asp.net sql asp.net-mvc entity-framework many-to-many

我在使用EF 4.1和多对多关系时遇到问题。我决定使用数据库第一种方法(尽管我在代码第一种方法时遇到了同样的问题),并且我创建了一个数据库模型:

enter image description here

我在图片和标签表之间有很多关系。在数据库中,它被创建为一个名为“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> 
}

我真的不知道出了什么问题......我希望得到任何建议或指出我正确的方向。

谢谢!

1 个答案:

答案 0 :(得分:2)

可能的解释是您不使用延迟加载,也没有加载Picture集合,包括相关标签(急切加载)。它应该是这样的:

//...
var pictures = db.Pictures.Include("Tags") // or Include(p => p.Tags) in EF 4.1
    .Where(...)
    .ToList();

return View(pictures);