Почему индивидуальные удаления звонков с удалением на каскад?
У меня есть две таблицы с отношением 1:n (одна animal
имеет много animal_events
) и удаление по каскаду в моей базе данных:
CREATE TABLE animals (
Id INTEGER PRIMARY KEY AUTO_INCREMENT,
Description VARCHAR(512),
Timestamp TIMESTAMP
);
CREATE TABLE animal_events (
Id INTEGER PRIMARY KEY AUTO_INCREMENT,
Begin DATETIME NOT NULL,
AnimalId INT,
Timestamp TIMESTAMP,
FOREIGN KEY animal_fk(AnimalId) REFERENCES animals(Id) ON DELETE CASCADE
);
Поэтому, когда я удаляю animal
все соответствующие animal_events
следует также удалить. Это то, что делается базой данных, запускается предложением delete on cascade всякий раз, когда я удаляю животное. Правильный?
Но в трассировке SQL я вижу много отдельных команд удаления. Почему платформа Entity Framework/ Devart делает это?
DELETE FROM rfidfarm.animal_events WHERE Id = 1
DELETE FROM rfidfarm.animal_events WHERE Id = 2
DELETE FROM rfidfarm.animal_events WHERE Id = 3
DELETE FROM animals WHERE Id = 1
Разве это не лишнее, так как база данных позаботится о animal_events
или это просто ошибка в моей настройке / конфигурации EF?
Обновления
Извлечение для файла edml
<Association Name="animal_events_ibfk_2">
<End Role="animals" Type="Model.Store.animals" Multiplicity="0..1">
<OnDelete Action="Cascade" />
</End>
Если я использую этот тестовый код, я вижу много отдельных удалений:
using (var uow = _modelFactory.CreateUnitOfWork())
{
var animal = uow.Animals.GetById(2);
var animalEventCount = animal.AnimalEvents.Count;
uow.Animals.Delete(animal);
uow.SaveChanges();
}
Если я использую этот код, то можно ожидать только одного удаления:
using (var uow = _modelFactory.CreateUnitOfWork())
{
var animal = uow.Animals.GetById(2);
uow.Animals.Delete(animal);
uow.SaveChanges();
}