2011-04-07 32 views
1

我在使用NHibernate和RIA服務時,以下關聯會導致我遇到問題。阻止NHibernate嘗試刪除關聯集合

User hasMany UserRoleGrants via the property user.Roles 

當我嘗試更新我的用戶Silverlight客戶端通過用戶實體服務層,但沒有填充的角色屬性(似乎是合理的,因爲它可能是一個大集合,爲什麼把它來回在網絡)。這導致NHibernate嘗試刪除此用戶的UserRoleGrants。

感覺就像我想做一個等效的session.Load,但只是爲user.Roles屬性而不是整個對象。

我該如何做到這一點?

編輯:這是我流利的映射

public UserMap() 
{ 
    Id(x => x.Id).GeneratedBy.HiLo("10000"); 
    Map(x => x.UserName).Unique().Not.Nullable().Length(255).Default(string.Empty); 

    HasMany(x => x.RoleGrants).KeyColumn("User_id").Cascade.None().Access.CamelCaseField().LazyLoad(); 
} 

感謝

回答

0

通常我們使用DTO進入/來自服務層。

如果您從數據庫中獲得用戶,更新字段並保存,角色集合將不會受到干擾。它被加載並保持不變,因此它不會被刪除。

3

可能是你不應該讓實體跨越服務邊界。改爲使用一些DTO並將其發送到服務。這個問題可以幫助:How to use NHibernate and DTOs with RIA Services

+0

它實際上是一個DTO,因爲服務只是將其序列化並將其反序列化爲生成的代理。 – BenCr 2011-04-07 13:56:13

+0

@BenCR看起來你正在將它視爲一個正規的實體。一旦在服務器上,你應該從ne會話中讀取uSer,並通過DTO – 2011-04-07 14:01:17

+0

進行更新。好吧,看起來我們可能以一種不被認爲是「最佳實踐」的方式使用NHibernate?你知道關於在服務上使用NHibernate的最佳實踐文章嗎? – BenCr 2011-04-07 14:04:01

0

如果你想初始化你的集合,你可能想使用NHibernateUtil.Initialize()(見this,第16.1.4節)。然而,如果你不在任何地方使用該集合,加載它並不是一個好主意。
你有沒有考慮讓關係非級聯?

+0

我已經添加了映射以表明該關聯是Cascade.None() – BenCr 2011-04-07 13:58:30

相關問題