2013-04-16 52 views
0

我遇到了Nhibernate问题,它为Cascade.None()中的一个实体持续生成HasOne关系。我的领域模型涉及以下4个类别。流利的Nhibernate Cascade.None()导致HasOne外键关系不被持久化

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财产不被保存到数据库。我已经诊断出这是在查看由Nhibernate生成的SQL,我可以看到ProjectRoles表中的“Role_id”列从未在更新或插入时设置。

我也使用

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

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

任何想法如何设置Cascade.None()的ProjectRole->角色关系与突破持久性。

回答

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 questionHasOneReferences之间的差异。

+0

完美的是这个问题。我刚刚假设HasOne是你在关系的孩子方面会做的。谢谢。 – AndrewSwerlick

相关问题