Свободный NHibernate один-ко-многим отключает ограничение внешнего ключа
У меня есть проблема, когда у меня есть отношение один ко многим, и я должен иметь возможность удалить родительский объект без удаления его дочерних элементов, а также для столбца внешнего ключа, установленного в NULL. Но всякий раз, когда я пытаюсь удалить родителя, я получаю исключение нарушения ограничения внешнего ключа.
NHibernate.Exceptions.GenericADOException: не удалось выполнить запрос на обновление [SQL: delete from [Customer]] ---> System.Data.SqlClient.SqlException: оператор DELETE конфликтует с ограничением REFERENCE "FK7867CB245055157F"
У меня есть аналогичные отношения один-к-одному, где я должен иметь возможность удалить сущность на одном конце без внешнего ключа на другом конце, который должен быть установлен в NULL, и я успешно решил эту проблему с помощью NotFound.Ignore(), Я нашел несколько ответов, предлагающих именно это решение, но, похоже, оно не дает никакого эффекта. Я использую свое отображение для создания базы данных.
Вот мои сущности и сопоставления:
public class User : Entity
{
...
public virtual Customer Customer { get; set; }
...
}
public class Customer : Entity
{
...
public virtual string CustomerNumber { get; set; }
public virtual User User { get; set; }
public virtual IList<Vehicle> Vehicles { get; set; }
...
}
public class Vehicle : Entity
{
...
public virtual string SerialNumber { get; set; }
public virtual Customer Customer { get; set; }
...
}
Я использую AutoMapping и переопределения:
public class UserMappingOverride : IAutoMappingOverride<User>
{
public void Override(AutoMapping<User> mapping)
{
...
mapping.References(u => u.Customer).Column("CustomerNumber").NotFound.Ignore();
}
}
public class CustomerMappingOverride : IAutoMappingOverride<Customer>
{
public void Override(AutoMapping<Customer> mapping)
{
mapping.Id(u => u.Kundenummer).GeneratedBy.Assigned().Not.Nullable();
mapping.HasOne(u => u.User).PropertyRef(c => c.Customer);
mapping.HasMany(u => u.Vehicles).KeyColumns.Add("CustomerNumber")
.Cascade.None()
.Inverse();
}
}
public class VehicleMappingOverride : IAutoMappingOverride<Vehicle>
{
public void Override(AutoMapping<Vehicle> mapping)
{
mapping.Id(u => u.SerialNumber).GeneratedBy.Assigned().Not.Nullable();
mapping.References(u => u.Customer).Column("CustomerNumber").NotFound.Ignore();
}
}
Как уже говорилось, в отношении "один к одному" в сопоставлении "Пользователь" я использую NotFound.Ignore(), который выполняет, как и было обещано, - позволяет мне удалять Клиента, не вызывая исключения нарушения ограничения, и при этом сохранять значения "CustomerNumber". "в таблице пользователей нетронутыми. Отображение отношений между сущностями Пользователь и Клиент просто не создает ограничения внешнего ключа в базе данных, когда база данных строится из сопоставления.
Но то же самое не работает для моих отношений один ко многим. Хотя сопоставление практически совпадает с моим отношением "один к одному", и я использую NotFound.Ignore(), как предлагается в аналогичных вопросах, приведенных здесь, это отношение все еще создает ограничение внешнего ключа, и я получаю исключение нарушения ограничения при попытке удалить клиент. Единственный обходной путь - вручную удалить FK в базе данных или изменить его, установив для параметра "Принудительное ограничение внешнего ключа" значение "Ложь".
Как я могу заставить NHibernate либо не создавать это ограничение внешнего ключа, либо задавать для Enfore Constraint Ограничение внешнего ключа значение False при построении базы данных?
С наилучшими пожеланиями - Николай
Кстати: меня не интересуют комментарии об общем дизайне сущностей и отношений. Они спроектированы таким образом, основываясь на ограничениях из источника данных, и это единственный возможный обходной путь. :-) Я обнаружил, что много ответов в подобных постах, сосредоточиться на дизайне, а не на вопрос под рукой.
2 ответа
Ответ Firo указал мне в правильном направлении, как избавиться от ограничения FK. Добавление .ForeignKey("none")
к транспортному картографированию не сделал этого, хотя. Но добавление аналогичного свойства в сопоставление Customer решило мою проблему.
Итак, решение стало:
mapping.HasMany(u => u.Vehicles).ForeignKeyConstraintName("none")
Вы не можете работать вокруг FK в базе данных. Я думаю, что нет FK от пользователя к клиенту. Если вы создаете схему из сопоставлений, вам нужно отключить создание FK с помощью mapping.References(u => u.Customer).ForeignKey("none");