Свободный Nhibernate Cascade.None() приводит к тому, что отношение внешнего ключа HasOne не сохраняется

У меня проблемы с сохранением отношения HasOne для одной из моих сущностей в Nhibernate с помощью Cascade.None(). Моя модель предметной области включает 4 класса, перечисленных ниже.

public class Project 
{
   public virtual int Id {get;set;}
   public virtual IList<ProjectRole> Team { get; protected set; }
}

public class ProjectRole
{
    public virtual int Id { get; set; }
    public virtual User User { get; set; }
    public virtual Role Role { get; set; }
}

public class Role
{
    public virtual int Id { get; set; }
    public virtual string Value { get; set; }
}

public class User
{
    public virtual int Id { get; protected set; }
    public virtual string LoginName { get; set; }
}

Таким образом, в основном у нас есть проекты, у которых есть список ProjectRoles, доступных из свойства Team. Каждая ProjectRole связывает пользователя с определенной ролью, которую они играют в этом проекте.

Я пытаюсь настроить следующие каскадные отношения для этих объектов.

project.HasMany<ProjectRoles>(p=> p.Team).Cascade.All()
projectRole.HasOne<Role>(r => r.Role).Cascade.None()
projectRole.HasOne<User>(r => r.User).Cascade.SaveUpdate()

Я использовал плавные переопределения nhibernate для настройки каскадов, как указано выше, но я обнаружил, что строка

projectRole.HasOne<Role>(r => r.Role).Cascade.None()

приводит к тому, что свойство ProjectRole.Role не сохраняется в базе данных. Я диагностировал это, глядя на SQL, сгенерированный Nhibernate, и я вижу, что столбец "Role_id" в таблице ProjectRoles никогда не устанавливается при обновлении или вставке.

Я также пытался использовать

projectRole.HasOne<Role>(r => r.Role).Cascade.SaveUpdate()

но это также не удается. К сожалению, оставить его Cascade.All() нельзя, так как в результате система удаляет объекты Role, когда я пытаюсь удалить роль проекта.

Любая идея, как настроить Cascade.None() для отношения ProjectRole-> Role без нарушения целостности.

1 ответ

Решение

HasOne для личных отношений, которые редки. Вы хотите использовать References объявить одну сторону отношений один ко многим. Делая некоторые предположения о вашей доменной модели, отображение должно выглядеть так:

project.HasMany<ProjectRoles>(p=> p.Team).Inverse().Cascade.AllDeleteOrphan()
projectRole.References<Role>(r => r.Role);
projectRole.References<User>(r => r.User);

Смотрите также этот вопрос о разнице между HasOne а также References,

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