HasOne или ссылки? - PullRequest
       4

HasOne или ссылки?

1 голос
/ 30 марта 2012

Я унаследовал базу данных и пытаюсь сопоставить ее с 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

Ответы [ 2 ]

1 голос
/ 02 апреля 2012

Попробуйте изменить настройку Cascade на «all-delete-orphan».В настоящее время вы каскадируете все, кроме EXCEPT, что означает, что БД будет жаловаться, когда вы пытаетесь создать «потерянную» запись.Говоря NHibernate, как с этим справиться (удалите все потерянные записи в ссылочной таблице после операции обновления или удаления), вы избежите проблемы.

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

0 голосов
/ 10 апреля 2012

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

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

...