Если я сейчас удалю турнир, все официальные лица, которые были связаны с
этот турнир удален, что я и хочу. Тем не менее, когда я
удалить должностное лицо, которое было сделано главным должностным лицом в одном из
турниры, удаление не проходит, ссылаясь на то, что удаление
заявление противоречило ограничению ссылки в
Tournaments.OfficialID.
Я думаю, что это совершенно разные ситуации. Первый случай работает, потому что в базе данных есть установка каскадного удаления (EF действительно создала это правило в базе данных, потому что требуется связь, это поведение по умолчанию).
Ваше второе отношение не является обязательным, поэтому каскадное удаление по умолчанию отсутствует. Более важно: я не думаю, что вы хотите каскадное удаление, потому что это будет означать, что удаление чиновника также приведет к удалению турниров, в которых этот чиновник является главой.
Я могу только представить, что вы хотите установить ссылку HeadOfficial
на null
, если чиновник будет удален. Но нет автоматического способа (например, для каскадного удаления). Вы должны запрограммировать такое поведение, например:
using (var ctx = new MyContext())
{
var officialToDelete = ctx.Officials.Single(o => o.OfficialID == 5);
var tournaments = ctx.Tournaments.Where(t => t.OfficialID == 5).ToList();
foreach (var tournament in tournaments)
tournament.OfficialID = null;
ctx.Officials.Remove(officialToDelete);
ctx.SaveChanges();
}
Я считаю, что цикл foreach
не является необходимым, потому что EF исправит отношения (= установит внешний ключ в null
), когда вы вызовете Remove
. (По сути, сам EF выполняет этот цикл внутренне.) Но важно, чтобы турниры загружались в контекст, потому что EF заботится об исправлении этих отношений (только для прикрепленных (= загруженных) объектов), а не о базе данных (в отличие от каскадного удаления ).