我在使用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函数的一部分。代码工作正常,不会产生任何错误,并在单个数据库上下文中工作。
完成此功能后,我可以在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>
}
我真不”不知道什么是错的......我会很感激任何建议或指引我朝着正确的方向前进。
谢谢!
非常感谢您,我不知道现在我必须明确告诉我collcetion我想附加一些东西。它在EF 4.1中是新的? – domderen
@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