【问题标题】:Fluent Nhibernate Cascade.None() results in HasOne foreign key relationship not being persistedFluent Nhibernate Cascade.None() 导致 HasOne 外键关系不被持久化
【发布时间】:2013-04-16 13:58:53
【问题描述】:

我在使用 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-> 角色关系设置 Cascade.None() 而不会破坏持久性。

【问题讨论】:

    标签: nhibernate cascade


    【解决方案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 之间的区别。

    【讨论】:

    • 完美,这正是问题所在。我刚刚假设 HasOne 是您在关系的孩子方面会做的事情。谢谢。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-06-28
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多