HasOne или ссылки?

Я унаследовал базу данных и пытаюсь сопоставить ее с Fluent NHibernate. У меня есть следующая схема:

CREATE TABLE [Signatures](
    [Id] [int] IDENTITY(1,1) PRIMARY KEY CLUSTERED NOT NULL,
    -- Other Fields....
)

CREATE TABLE [SignoffSteps](
    [Id] [int] IDENTITY(1,1) PRIMARY KEY CLUSTERED NOT NULL,
    [SignatureId] [int] NULL REFERENCES [Signatures]([Id]),
    -- Other Fields....
)

И я пытаюсь сопоставить его со следующим (дополнительные свойства и сопоставления опущены):

public class SignoffStep
{
    public virtual int Id { get; set; }
    public virtual Signature Signature { get; set;}

    public class Map : ClassMap<SignoffStep>
    {
        public Map()
        {
            Table("SignoffSteps");
            Id(x => x.Id);

            References(x => x.Signature, "SignatureId")
                .Nullable()
                .ForeignKey("FK_SingoffSteps_Signatures")
                .Cascade.All()
                .Not.LazyLoad();
        }
    }
}

public class Signature
{
    public virtual int Id { get; set; }

    public class Map : ClassMap<Signature>
    {
        public Map()
        {
            Table("Signatures");
            Id(x => x.Id);
        }
    }
}

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

session.Delete(signoffStep.Signature);
signoffStep.Signature = null;

Но то, что я хотел бы сделать, это просто установить для свойства Signature на этапе выхода значение null, и NHibernate автоматически удалит дочерний элемент. Есть ли способ настроить мое сопоставление для этого?

РЕДАКТИРОВАТЬ: установка для Cascade значения «all-delete-orphan» невозможна: Intellisense


person Alex Moore    schedule 30.03.2012    source источник


Ответы (2)


Попробуйте изменить параметр Cascade на «все-удалить-сироту». В настоящее время вы каскадируете все, КРОМЕ удаления, что означает, что БД будет жаловаться, когда вы попытаетесь создать «сиротскую» запись. Сообщив NHibernate, как с этим справиться (удалить любые потерянные записи в таблице, на которую ссылаются, после операции обновления или удаления), вы избегаете проблемы.

Поймите, что для того, чтобы каскадирование NH работало, FK ссылочной таблицы должен быть обнуляемым, чтобы NH мог установить его равным нулю (осиротевшим запись) при первом проходе. AFAIK, NH в настоящее время не предоставляет способ каскадного удаления дочерних записей с FK, не допускающим нулевого значения.

person KeithS    schedule 02.04.2012
comment
Добавлено редактирование выше. Каскадное удаление всех сирот невозможно с отношением References, я думаю, что это только на HasMany. - person Alex Moore; 10.04.2012

В итоге у меня появилось свойство «ToDelete» в подписи, и я вручную удалил их во время сохранения. Мне это не нравится, потому что это нарушает абстракцию, но пока работает.

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

person Alex Moore    schedule 10.04.2012