2014-05-15 2 views
1

У меня есть блог-сайт, построенный с использованием C# ASP.NET и структуры сущностей. Я создаю страницу для создания блога, который позволяет пользователю добавлять теги. Это прекрасно работает. Однако, когда дело доходит до редактирования сообщения в блоге, я уверен, что мне не хватает трюка. Я не могу понять, как обновить все теги, прикрепленные к сообщению в блоге, в один простой процесс.Как обновить все теги в блоге?

Объекты Blog и Tag настроены как многие-ко-многим.

Так в настоящее время у меня есть:

_blog = blogRepo.GetBlogByID(blog.Id); 
_blog.Tags = blog.Tags; 
blogRepo.UpdateBlog(_blog); 
blogRepo.Save(); 

Который работает нормально, если я добавляю новые теги. Однако, если я удаляю теги, он работает только с Entity Framework. Как только DB Context повторно инициализируется, он выбирает из базы данных, что тег все еще привязан к блогу.

E.g. У меня есть тег «test», добавленный в блог. Я редактирую блог и удаляю тег «test» и сохраняю блог. Блог возвращается одним и тем же запросом с пустым тегом. Если я затем сделаю еще один запрос для блога, то тег «test» снова появится.

Я думал, что могу просто удалить все теги из блога каждый раз, а затем добавить все, что есть. Но я уверен, что должен быть лучший способ. Или что-то не так, и это должно работать в текущей настройке?

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

+0

Можете вы добавить свой код, где будете снимать? –

+0

@NathanA на самом деле нет кода удаления. Blog.Tags - это новый список тегов, которые могут иметь новые теги, могут иметь меньше тегов или могут быть одинаковыми. Удаление - это то, что я пытаюсь выработать. – AndrewPolland

ответ

0

Вы не можете просто назначить новый дочерний список объекту объектов и ожидать, что сущности выяснят все ваши изменения. Вы должны сделать это сами. Вот простой способ сделать это. Это не самый эффективный, и есть хитрости, чтобы ускорить это, но он работает.

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

//Generate a list of tags to remove 
var tagsToRemove = _blog.Tags.Except(myNewListOfTags).ToArray(); 

foreach(var toRemove in tagsToRemove) 
    _blog.Tags.Remove(toRemove); 

...Save changes 

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

_myDbContext.Database.ExecuteSqlCommand(
    "DELETE FROM BlogTagsManyToManyTable WHERE BlogId = @BlogId", 
    new SqlParameter("@BlogId", blogId)); 

Затем я могу добавить новый список тегов в блоге без необходимости выполнять какую-либо специальную работу.

+0

Отлично. Спасибо. – AndrewPolland