2013-04-16 54 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

相關問題