2011-10-04 114 views
1

我在使用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函数的一部分。代码工作正常,不会产生任何错误,并在单个数据库上下文中工作。

完成此功能后,我可以在PictureTag表格中查看我的数据库,所有三张图片,标签和实体中的数据。

然而,当我尝试将我的视图图片和与该图片相对应的标签放在一起时,我看不到任何标签。就像没有任何图片附有任何标签。我知道这是不正确的,因为我在DB看到的数据,所以我不知道什么是错的...

这是FR我的看法代码:

@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> 
} 

我真不”不知道什么是错的......我会很感激任何建议或指引我朝着正确的方向前进。

谢谢!

回答

2

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

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

return View(pictures); 
+0

非常感谢您,我不知道现在我必须明确告诉我collcetion我想附加一些东西。它在EF 4.1中是新的? – domderen

+1

@Tromax:不,它不是新的。在EF中总是有三种方法来加载导航属性:延迟加载,预先加载和明确加载。 EF 4.1没有改变。以下是关于它的概述:http://blogs.msdn.com/b/adonet/archive/2011/01/31/using-dbcontext-in-ef-feature-ctp5-part-6-loading-related-entities .aspx如果你不想在查询中使用'Include',你可以使用延迟加载,然后加载自动发生,你的原始代码就可以工作。尽管延迟加载会导致多次往返数据库。 – Slauma