2011-10-04 116 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