Свободный 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
,