2011-10-04 4 views
1

J'ai un problème avec l'utilisation de EF 4.1 et de nombreuses relations. J'ai décidé d'utiliser la première approche de base de données (bien que je suis le même problème avec la première approche de code), et je créé un modèle de la base de données:Entity Framework plusieurs à plusieurs relation ne fonctionne pas

enter image description here

J'ai plusieurs à plusieurs rapports entre l'image et les tables de Tag . Dans la base de données, il est créé en tant que nouvelle table appelée "PictureTag" avec les champs "Picture_Id" et "Tag_Id".

J'ajoute des données à ma base de données avec le morceau de code suivant:

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(); 

Ceci est bien sûr juste une partie de mon code. C'est une partie de ma fonction Crawler. Le code fonctionne correctement, ne génère aucune erreur et fonctionne sur un seul contexte de base de données.

Une fois cette fonction terminée, je peux voir les données dans ma BD, les trois images, les balises et les entités dans la table PictureTag.

Pourtant quand j'essaie de mettre sur mes images de vue, et les étiquettes qui correspondent à cette image, que je ne peux pas voir des étiquettes. Comme aucune des images n'avait des étiquettes attachées à eux. Je sais que ce n'est pas vrai, parce que je vois des données dans mon DB, donc je ne sais pas ce qui est mal ...

Ce code fr mon avis:

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

Je ne vraiment » Je sais ce qui ne va pas ... J'apprécierais tout conseil ou me diriger dans la bonne direction.

Merci!

Répondre

2

L'explication possible est que vous n'utilisez pas le chargement paresseux et n'a pas non plus chargé votre Picture collection y compris les étiquettes liées (chargement ardent). Il devrait ressembler à ceci:

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

return View(pictures); 
+0

Merci beaucoup, je n'avais aucune idée que maintenant je dois explicitement informer mon collcetion que je veux attacher quelque chose. C'est nouveau dans EF 4.1? – domderen

+1

@Tromax: Non, ce n'est pas nouveau. Il y avait toujours trois façons de charger les propriétés de navigation dans EF: chargement paresseux, chargement effacé et chargement explicite. Cela n'a pas changé avec EF 4.1. Voici un aperçu à ce sujet: http://blogs.msdn.com/b/adonet/archive/2011/01/31/using-dbcontext-in-ef-feature-ctp5-part-6-loading-related-entities .aspx Si vous ne voulez pas utiliser 'Include' dans vos requêtes, vous pouvez utiliser le chargement différé, puis le chargement se fait" automatiquement "et votre code original fonctionnera. Le chargement paresseux provoque cependant plusieurs allers-retours avec la base de données. – Slauma

Questions connexes