0

我在使用 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() 不是一个选项,因为当我尝试删除项目角色时,这会导致系统删除角色对象。

知道如何为 ProjectRole-> Role 关系设置 Cascade.None() 而不会破坏持久性。

4

1 回答 1

1

HasOne是一种罕见的一对一关系。您想使用References来声明一对多关系的一侧。对您的域模型进行一些假设,映射应如下所示:

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

另请参阅有关和之间的区别的问题HasOneReferences

于 2013-04-16T14:07:14.113 回答