У меня есть отношение внешнего ключа между двумя таблицами UserProducts и Users в моей базе данных, причем UserProducts имеет UserID, ссылающийся на UserID в таблице Users.
ALTER TABLE [dbo].[UserProducts] WITH CHECK ADD CONSTRAINT [FK_UserProducts_Users] FOREIGN KEY ([UserID])
REFERENCES [dbo].[Users] ([UserID])
GO
ALTER TABLE [dbo].[UserProducts] CHECK CONSTRAINT [FK_UserProducts_Users]
GO
Столбец UserID в таблице UserProducts является частью составного первичного ключа с другим столбцом ProductID. Также есть два дополнительных столбца DateTime, поэтому Entity Framework не рассматривает UserProducts как таблицу ссылок.
В этом внешнем ключе НЕТ каскадного удаления, и я не настроил ничего для обработки OnDelete в ассоциации внешнего ключа Entity Framework. Тем не менее, когда я удаляю объект User из кода, Entity Framework позволяет удалить UserProducts, связанные с ним по UserID. Для этого также генерируется много SQL: для каждой связанной записи в таблице UserProducts существует отдельная команда DELETE.
Код для выполнения удаления объекта выглядит следующим образом:
using (var context = new LicensingRegistrationContext(_csb))
{
context.Database.Log = a => _logger.Trace(a);
var dbUser = GetUserDbSetWithIncludes(context)
.Where(a => a.UserID == user.Id).Single();
context.DbUsers.Remove(dbUser);
//TODO(MRL): Um...how are the dbUserProducts being removed???
context.SaveChanges();
}
Как это происходит? Я почти уверен, что в EF 4 EF никогда не брал на себя такую смелость: вы ДОЛЖНЫ были загружать, а затем удалять все связанные объекты вручную в коде.
Спасибо