0

Пожалуйста, обратите внимание на следующее соотношение:Каскад на удаление - сложный тип, сопоставленный с таблицей

Автомобиль (сущность) 1 ---------------------- > * колеса (Entity)

колеса (юридическое лицо) 1 ---------> 1 Гайка (Сложный тип)

колеса (юридическое лицо) 1 ---------> 1 Оправа (сложный тип)

Оба типа комплекта Nut и Rim сопоставляются таблицам с именем Nuts and Rims. Я использую Wheel ID как первичный ключ Nuts and Rims.

Теперь, при попытке удалить автомобиль с помощью кода, я получаю следующее исключение:

System.InvalidOperationException: The operation failed: The relationship could not be changed because one or more of the foreign-key properties is non-nullable. When a change is made to a relationship, the related foreign-key property is set to a null value. If the foreign-key does not support null values, a new relationship must be defined, the foreign-key property must be assigned another non-null value, or the unrelated object must be deleted. 
at System.Data.Entity.Core.Objects.ObjectContext.PrepareToSaveChanges(SaveOptions options) 
at System.Data.Entity.Core.Objects.ObjectContext.SaveChangesInternal(SaveOptions options, Boolean executeInExistingTransaction) 
at System.Data.Entity.Core.Objects.ObjectContext.SaveChanges(SaveOptions options) 
at System.Data.Entity.Internal.InternalContext.SaveChanges() 
at System.Data.Entity.Internal.LazyInternalContext.SaveChanges() 
at System.Data.Entity.DbContext.SaveChanges() 

При попытке это сделать в ms- SSMS, я получаю эту ошибку: The ВЕЬЕТЕ конфликтные с ССЫЛКА ограничение "FK_dbo.Nuts_dbo.Wheel_Id". Конфликт произошел в базе данных «DatabaseName», таблице «dbo.Nuts», в столбце «Id».

Учитывая, что сложные типы являются обязательными параметрами для объекта и имеют отношение «один к одному», почему каскадное удаление не будет включено по умолчанию в этом сценарии? Во-вторых, как следует устранить CAR и связанные с ним многие колеса вместе со всеми связанными гайками и ободами. Наконец, в моем случае автомобиль имеет тысячи колес. Это хорошая идея для этого в коде или для использования хранимых процедур?

Спасибо.

+0

Если гайка и обойма сложны, тогда они будут сопоставлены столбцам в таблице Wheel. Если у них есть своя таблица, то они представляют собой объекты с отношением от 1 до 1. –

ответ

0

Как отмечает Бен Робинсон в своем комментарии, назначение классов, приписываемых [ComplexType], заключается в том, чтобы их свойства сопоставлялись с столбцами в таблице содержащего типа. Не должно быть таблиц с орехами или ободами. Если это не желаемое поведение, то они не должны быть сложными типами.

Предположим, что они не должны быть сложными типами и работать, почему они не являются каскадным удалением. Сосредоточившись на гайке и предполагая, что вы не используете безвозмездную конфигурацию, я подозреваю, что вам нужно будет иметь свойство навигации для Wheel on the Nut, а также WheelId. Я думаю, что WheelId будет отмечен [Key] и [ForeignKey (Wheel)]. Главное - свойство навигации.

С беглым конфигурацией вы бы навигационным свойство колеса, а затем, в конфигурации колеса, вы бы:

HasRequired(wheel => wheel.Nut) 
    .WithRequiredDependent(nut => nut.Wheel); 

Еще следует отметить, что каскадное удаление, если это не созданный по вашему вкусу, может быть изменен внутри миграции при создании внешнего ключа с помощью аргумента метода.

Наконец, чтобы ответить на вопрос о пакетном удалении: Cascade delete будет выполняться в базе данных, если вы удалите автомобиль, и он каскадом удалит колесо, и это должно быть быстрым. Если вы хотите выполнить удаление многих колес для автомобиля отдельно, посмотрите на Entity Framework Extensions: http://efe.codeplex.com/

Смежные вопросы