流畅的Nhibernate Cascade.None()导致HasOne外键关系没有被持久化

时间:2013-04-16 13:58:53

标签: nhibernate cascade

我遇到了Nhibernate的问题,因为我的一个实体的Cascade.None()实际上持久存在一个HasOne关系。我的域名模型包含以下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; }
}

基本上我们有项目,其中有一个可从Team属性中获得的ProjectRoles列表。每个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属性未保存到数据库。我已经诊断出这是在查看Nhibernate生成的SQL,我可以看到ProjectRoles表中的“Role_id”列永远不会在更新或插入时设置。

我也尝试过使用

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

但也失败了。不幸的是,将它留下Cascade.All()不是一个选项,因为当我尝试删除项目角色时,系统会删除Role对象。

知道如何为ProjectRole设置Cascade.None() - &gt;角色关系与破坏持久性。

1 个答案:

答案 0 :(得分:1)

HasOne是一对一的关系,很少见。您希望使用References来声明一对多关系的一方。对您的域模型做出一些假设,映射应如下所示:

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

另请参阅this question,了解HasOneReferences之间的区别。