2012-03-30 2 views
1

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

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; 

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

EDIT: Настройка каскада на "все-удалить-сирота" не выполнимо: Intellisense

ответ

0

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

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

1

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

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

+0

Добавлено править выше. Cascade all-delete-orphan невозможно с отношением References, я думаю, что это только на HasMany. –

+0

Upvotes для усилий. Благодаря! –