Свободный 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");

Другие вопросы по тегам