2011-08-23 1 views
0

J'ai un modèle vidéo avec une collection de balises que je veux créerCréer ou mettre à jour le modèle de l'enfant dans ASP.NET MVC/cadre Entify

public class Video{ 
    public int Id { get; set; } 
    public string Title { get; set; } 
    public virtual ICollection<Tag> Tags { get; set; } 
    etc. 
} 

public class Tag 
{ 
    public int Id { get; set; } 
    public string Name { get; set; } 
    public virtual ICollection<Video> Videos { get; set; } 
} 

J'ai une norme générée action du contrôleur qui ressemble à ceci: La liaison de modèle semble fonctionner correctement, j'obtiens une nouvelle vidéo avec les valeurs désirées, et une collection de balises. (clés primaires, 1,7, 34 etc)

Cependant, avec cette méthode, la nouvelle vidéo n'est pas liée aux tags existants, elle en crée toujours de nouveaux.

Existe-t-il une manière automatique que si l'étiquette avec l'Id fourni existe, il n'est pas créé un nouveau, mais il est seulement créé une relation à l'existant?

Répondre

0

Je pense que vous avez besoin des balises d'approvisionnement via des cases à cocher sur la page de création de vidéo, et si l'utilisateur ne trouve pas lié, il peut en créer un nouveau via le même nom. voici un exemple pour la mise à jour des cases à cocher je l'ai eu à partir asp.net le site mvc

private void UpdateInstructorCourses(string[] selectedCourses, Instructor instructorToUpdate) 
{ 
if (selectedCourses == null) 
{ 
    instructorToUpdate.Courses = new List<Course>(); 
    return; 
} 
var selectedCoursesHS = new HashSet<string>(selectedCourses); 
var instructorCourses = new HashSet<int> 
    (instructorToUpdate.Courses.Select(c => c.CourseID)); 
foreach (var course in db.Courses) 
{ 
    if (selectedCoursesHS.Contains(course.CourseID.ToString())) 
    { 
     if (!instructorCourses.Contains(course.CourseID)) 
     { 
      instructorToUpdate.Courses.Add(course); 
     } 
    } 
    else 
    { 
     if (instructorCourses.Contains(course.CourseID)) 
     { 
      instructorToUpdate.Courses.Remove(course); 
     } 
    } 
} 
} 

mon avis, il est meilleure façon de le faire, le HashSet comprennent également de nouvelles étiquettes si vous avez créé avec le même nom zone de texte.

ici est le tutoriel complet

http://www.asp.net/entity-framework/tutorials/updating-related-data-with-the-entity-framework-in-an-asp-net-mvc-application

+0

Je vais avoir des centaines de tags, les cases à cocher ne vont pas le couper. J'utilise une zone de texte avec autocomplete de jqueryui et plusieurs valeurs. –

0

Voici ce que je fini par faire:

var newtags = new List<Tag>(); 
     foreach (var tag in video.Tags) 
     { 
      var t = db.Tags.SingleOrDefault(d => d.Name.ToLower() == tag.Name.ToLower()); 
      if (t != null) 
      { 
       newtags.Add(t); 
       continue; 
      } 
      if (!string.IsNullOrWhiteSpace(tag.Name)) 
      { 
       newtags.Add(tag); 
      } 
     } 
video.Tags = newtags; 

De cette façon, les balises sont vérifiées avec la base de données, et si elles existent, j'ajouter l'étiquette existante à une liste temporaire, si elle n'existe pas, j'ajoute la nouvelle étiquette à la liste temporaire.

Ensuite, réaffectez tous les tags à la nouvelle liste, certains nouveaux, d'autres anciens.

De nouvelles étiquettes sont ensuite créées, et liées à la vidéo, les autres sont uniquement liées.

Vous ne savez pas si c'est la meilleure solution.

Questions connexes