Можно ли избежать переписывания свойств, отображающих отношение «один ко многим»? - PullRequest
0 голосов
/ 07 марта 2012

Я занимаюсь разработкой блогового приложения в ASP.NET MVC и сомневаюсь, что мое решение об обновлении некоторых связанных классов является полностью правильным. У меня есть класс, представляющий тексты:

public partial class Text
{
    public long ID { get; set; }
    public string Title { get; set; }
    ...
    public virtual ICollection<Tag> Tags { get; set; }
}

и теги:

public partial class Tag
{
    public long ID { get; set; }
    public string Name { get; set; }
    public virtual ICollection<Text> Texts { get; set; }
}

Когда я редактирую тексты, TextEditorViewModel передается:

public class TextEditorViewModel
{
    public long ID { get; set; }
    public string Title { get; set; }
    public string Content { get; set; }
    public IEnumerable<TagEditorViewModel> Tags { get; set; }
}

TagEditorViewModel - это:

public class TagEditorViewModel
{
    public long ID { get; set; }
    public string Name { get; set; }
    public bool IsInText { get; set; }
}

В представлении я проверяю подходящие теги (это отражается в свойстве IsInText), и это прекрасно работает, и правильные данные передаются обратно в контроллер. Вот мой код для репозитория, на котором работает контроллер:

Text OriginalText = Mapper.Map<Text>(Text);
IEnumerable<long> tags = OriginalText.Tags.Select(tag => tag.ID);
ICollection<Tag> tagobj = context.Tags.Where(tag => tags.Contains(tag.ID)).ToList();
OriginalText.Tags = tagobj;

Текст - это объект TextEditorViewModel, который передается обратно на пост. Я использую mapper для связывания только примитивных типов и переписываю все типы коллекций и ссылок (как показано выше), только теги, отмеченные как не в тексте, отфильтровываются. Есть ли более простой способ управления тегами вместо запроса базы данных и их переписывания?

1 Ответ

1 голос
/ 08 марта 2012

Вы можете прикрепить теги вручную к контексту, а не перезагружать их из базы данных, поскольку у вас есть идентификатор тегов, достаточный для создания / обновления отношения:

Text OriginalText = Mapper.Map<Text>(Text);
foreach (var tag in OriginalText.Tags)
    context.Tags.Attach(tag);
context.Texts.Add(OriginalText);
context.SaveChanges();

(я взял последние две строки из вашего комментария.)

Несмотря на то, что свойства в разных тегах не имеют значений из базы данных (кроме идентификатора), они будут работать, потому что EF нужен только правильный идентификатор тега для создания отношения.

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