Создание или обновление дочерней модели в ASP.NET MVC / Entify Framework - PullRequest
0 голосов
/ 23 августа 2011

У меня есть видео модель с коллекцией тегов, которые я хочу создать

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

У меня есть стандартное сгенерированное действие контроллера, которое выглядит так:

  [HttpPost]
  public ActionResult Create(Video video)
  {
        if (ModelState.IsValid)
        {
            db.Videos.Add(video);
            db.SaveChanges();
            return RedirectToAction("Index");  
        }
  }

Модельпривязка, кажется, работает правильно, я получаю новое видео с нужными значениями и набор тегов.(первичные ключи, 1,7, 34 и т. д.)

Однако при использовании этого метода новое видео не привязывается к существующим тегам, оно всегда создает новые.

Существует ли автоматический способ, что, если тег с предоставленным Id существует, он не создается новым, но создается только отношение к существующему?

Ответы [ 2 ]

0 голосов
/ 24 августа 2011

Вот что я в итоге сделал:

 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;

Таким образом, теги проверяются с помощью базы данных, и если они существуют, я добавляю существующий тег во временный список, если он не существуетЯ добавляю новый тег во временный список.

Затем переназначаю все теги на новый список, некоторые новые, некоторые старые.

Затем создаются новые теги и привязываются к видео,остальные только связаны.

Не уверен, что это лучший способ.

0 голосов
/ 23 августа 2011

Я думаю, вам нужны теги снабжения с помощью флажков на странице создания видео, а затем, если пользователь не может найти связанный, он может создать новый с помощью того же тега имени в текстовых полях.Вот пример обновления флажков, которые я получил с сайта asp.net 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);
        }
    }
}
}

По моему мнению, это лучший способ сделать это, в хешсет также добавляются новые теги, если вы создали текстовое поле с тем же именем.

вот полный учебник

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...