3

Проблема возникает при создании каскадных внешних ключей с использованием следующих моделей, в которых только одна модель (UserAddition) знает другую (Пользователь), и нет возможности добавить свойство UserAddition к пользователю класс:Fluent NHibernate External Key/Cascading

class User { 
    public virtual Guid Id { get; set; } 
    // Other fields of no relevance 
} 

class UserAddition { 
    public virtual Guid Id { get; set; } 
    public virtual User RemoteUser {get; set; } 
    public virtual string AdditionalData {get; set; } 
} 

Сформированные таблицы SQL для UserAddition должны иметь внешний ключ для пользователя, который установлен в положении ON DELETE CASCADE (установка ON UPDATE не важно).

При использовании следующего класса сопоставления для внешнего ключа всегда установлено значение «Нет действий», даже если оно указано иначе при сопоставлении. Я что-то упускаю?

public class UserAdditionMapping : ClassMap<UserAddition> 
{ 
    public TrainerToEmployeeMapping() 
    { 
     this.Id(x => x.Id); 
     this.References(x => x.RemoteUser).ForeignKey().Cascade.All(); 
    } 
} 

База данных используется является Microsoft SQL Server 11.

Спасибо.

+0

Возможно, существует недостающая связь между сопоставлениями. Вы уже просмотрели http://stackoverflow.com/questions/4017901/fluent-nhibernate-cascade-delete-not-working –

+0

Как я уже говорил выше, Пользователь не может иметь ссылку на UserAddition - только UserAddition может иметь Поле пользователя - я ищу решение, в котором мне не нужно изменять класс User. – Fionn

+0

http://stackoverflow.com/a/7737697/40822 – dotjoe

ответ

0

Вы можете попробовать это:

this.References (х => x.RemoteUser) .Column ("YourColumnName") Cascade.All();.

+0

Не работает, действие «Удалить» и «Обновление каскада» все еще сгенерировано как «Нет действий». – Fionn

0

Ответ здесь NHibernate mapping not adding ON DELETE CASCADE option to foreign key reference. Процитировать:

NHibernate может генерировать только on delete cascade ограничения на обратных коллекций.

Код фрагмент из NHibernate.Mapping.Collection:

public virtual void Validate(IMapping mapping) 
{ 
    if (Key.IsCascadeDeleteEnabled && (!IsInverse || !IsOneToMany)) 
    { 
     throw new MappingException(string.Format(
      "only inverse one-to-many associations may use on-delete=\"cascade\": {0}", Role)); 
    } 
... 

А потом, в совершенстве, вы бы отображение, как это:

HasMany(x => x.UserAdditions) 
    ... 
    // the setting 
    .ForeignKeyCascadeOnDelete() 

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