Как выполнить -disconnected- удалить в отношениях многие ко многим (Entity Framework Code First)
У меня есть следующий код для добавления записи в отношение "многие ко многим" отключенным способом. Интересно, возможно ли выполнить операцию удаления с отключенным подходом?
using (var db = new FMyDbContext())
{
int selectedTeamId = Convert.ToInt32(lst_AllTeams.SelectedValue);
Team myTeam = new Team() { TeamId = selectedTeamId };
int selectedCompId = Convert.ToInt32(grd_Competitions.SelectedValue.ToString());
Competition myComp = new Competition() { CompetitionId = selectedCompId };
myComp.ParticipatingTeams = new List<Team>() { myTeam };
db.Entry(myComp).State = System.Data.Entity.EntityState.Unchanged;
db.Entry(myTeam).State = System.Data.Entity.EntityState.Unchanged;
db.SaveChanges();
};
Это хорошо работает для вставки. Как я могу использовать аналогичный подход при удалении? По сути, я не хочу получать какие-либо записи из базы данных. Я ищу решение без выполнения оператора SQL с ExecuteStoreCommand.
1 ответ
Это просто невозможно. В ассоциациях "многие ко многим" со скрытой сущностью соединения вы можете работать только с независимыми ассоциациями. Это тип ассоциации без свойства внешнего ключа, представленного в модели класса: между внешним ключом нет Team
а также Competition
,
Таким образом, вы должны загрузить коллекцию перед удалением элементов из нее.
Если вы действительно хотите избежать этого, вы можете сделать две вещи:
- Вытащите класс соединения (
CompetionTeam
) в вашу модель. Теперь вы можете создавать объекты-заглушки для соединений и помечать их какDeleted
, - Создайте второй класс контекста, который имеет
DbSet<CompetionTeam>
и использовать этот контекст для непосредственного управления соединениями.
Последний вариант менее распространен, но он вполне допустим. Но включение класса соединения в вашу модель, вероятно, лучше всего сделать, потому что часто люди рано или поздно захотят сохранить информацию об ассоциации. Это возможно только тогда, когда класс является частью модели.