2014-04-01 71 views
1

我有一種情況,我不想補充一個引用的對象,只想更新對象上的id列。避免在id更新時重新水化實體nhibernate

public AppointmentMap() { 

Table("appointment"); 
Id(x => x.appointment_id).GeneratedBy.Identity().Column("appointment_id"); 
References(x => x.actiongroup).Column("appointment_actiongroup_id"); 
References(x => x.resource).Column("appointment_resource_id"); 
References(x => x.client).Column("appointment_client_id"); 

... Other fields 

我希望能夠在保存時更新appointment_client_id,但仍然有用於顯示目的的客戶端對象。如果這種情況做了我需要的一切,除了我想通過設置其整數值來保存appointment_client_id的部分以外,我不想使用DTO或其他構造來製造特殊情況。我正在使用無會話事務,因爲我正在運行的應用程序服務將使用Web服務打包,我不希望使用會話事務。

簡短的問題,你可以保存一個對象與其ID變化只有沒有補液發生。在我的應用程序中有數百個地方需要這樣的地方。

回答

1

我們可以使用的一種技術是映射兩者:ReferenceReferenceId。其中一人只是必須標記爲insert="false"update="false"

// readonly reference with all the stuff for querying 
References(x => x.actiongroup) 
    .Column("appointment_actiongroup_id") 
    .Not.Insert().Not.Update(); 

// the only editable mapping 
Map(x => x.actiongroupId, "appointment_actiongroup_id"); 

我使用反轉方法中,ReferenceId是隻讀的,現在監守它是很難在INSERT期間管理正確的ID ......不過這是工作

+0

到目前爲止,這似乎是唯一的方法。我花了好幾個小時嘗試所有類型的東西,最後想出了相同的解決方案。我很想知道是否有任何消極的做法。我明天會測試更多這種解決方案,因爲我看到這個工作後馬上就會死掉。到目前爲止,你似乎有唯一的解決方案。 – SamMan

+0

嗯,我真的很長一段時間使用doubled(reference和referencedId)映射。這是工作。對你來說甚至更好 - 設置引用來允許Insert(),但Not.Update(),並且將referenceId設置爲Not.Insert() - 但是Update()...簡單地說,我們可以使用;)享受NHibernate –

+0

我知道這可能看起來很明顯,但告訴我,如果我是正確的,這將允許我創建一個新的引用實體並將其插入,但我將失去對這些實體的更新。但是,我所獲得的是通過允許我更新引用來更改指向哪個實體。無論如何,我可能不會編輯引用對象,因爲無論如何我都使用存儲庫方法,並且使用nhibernate處理Web服務,並使用映射來減少數據檢索的工作量。 – SamMan