Первый код и каскад на удаление ошибок с простой моделью - PullRequest
2 голосов
/ 17 декабря 2011

У меня есть простая модель для отслеживания аренды шкафчиков, как способ изучения принципов EF Code First и DDD. Модель имеет следующие требования:

  • Может быть много организаций (т.е. школ, колледжей и т. Д.).
  • В каждой организации может быть много шкафчиков и много периодов аренды.
  • Для каждой уникальной пары шкафчик и период аренды может быть несколько арендных плат (т.е. каждый шкафчик может быть сдан в аренду нескольким разным людям за один семестр).

Модель настроена так:

Организация имеет две коллекции; один для хранения коллекции шкафчиков и один для хранения периодов аренды. Шкафчик и период аренды не содержат ссылок на свою родительскую организацию, чтобы соответствовать традиции DDD, однако оба они содержат обязательный внешний ключ к своей родительской организации. Шкафчик и период аренды содержат коллекцию аренды. Прокат имеет обязательный внешний ключ для шкафчика и обязательный внешний ключ на период аренды. Изображение ниже даст хорошее представление о том, как выглядит моя модель.

Это будет сделано, поскольку эта организация моделируется каскадным удалением, поэтому при удалении организации удаляются все связанные с ней шкафчики и периоды аренды. Но я полагаю, что также имеет смысл моделировать период хранения и аренды с помощью каскадного удаления, чтобы при удалении шкафчика удалялись все связанные с ним аренды. То же самое относится и к периоду аренды. Когда я настраиваю его таким образом, EF говорит мне, что я не могу этого сделать, поскольку он может создавать циклы или несколько каскадных путей. Однако, если я возьму какое-либо одно отношение (неважно, какое) и отключу каскадное удаление, то это прекрасно создаст базу данных. Я полагаю, что это устраняет проблему с несколькими каскадами.

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

Я включил тестовый проект ниже (решение Visual Studio 2010). Единственное, что нужно изменить - это строка подключения в App.config. Я открыт для всех предложений, так как я только начинаю изучать принципы EF Code First и DDD.

http://i.stack.imgur.com/MBjKU.png

http://www.mediafire.com/?kj3rrg433bq8i5g

1 Ответ

2 голосов
/ 18 декабря 2011

Это на самом деле не смоделировано неправильно, просто SQL Server (не EF) не допускает несколько каскадных путей.Если ваш Organization удален, он вызывает каскадное удаление как Lockers, так и RentalPeriods, и оба они вызывают каскадное удаление до Rentals = проблемы.Вы должны быть в порядке, если только один из них вызывает каскадное удаление до Rentals.Вы должны только убедиться, что Lockers или RentalPeriods не удаляются отдельно.Если это так, вы должны правильно обработать удаление Rentals вручную или использовать триггеры базы данных (распространенный способ избежать этой проблемы).

...