2010-09-22 50 views
1

我有這樣爲什麼編號從1改爲1碰巧使用NHibernate

<class name="UserFileSummary" table="UserFile" lazy="false"> 
    <id name="FileId" column="UserFileId" type="int"> 
     <generator class="identity" /> 
    </id>... 

映射像這樣

public long FileId { get; set; } 

我不明白的是在c#對象的屬性爲什麼當我使用

var myFile = session.Get<UserFileSummary>(id) 

變化的實例字段的值,然後將它保存這樣

myFile.myProperty = newValue 
session.Save(myFile) 

我得到一個錯誤,說Id已經從1改爲1.有一些關於此的帖子,但這是一個簡單的int列(標識1,1)。我一定犯了一些基本錯誤,請任何人幫忙。由於

的問題,原來是一個非問題,我已經添加了此位爲編輯

的FILEID屬性的類型爲長,映射是int類型,這就是爲什麼從1改變到1是一個問題。

請給我一些反饋,如果你要我刪除這個問題,謝謝大家:)

+0

您是否有完整的類映射來演示問題? – 2010-09-22 13:46:47

+0

我可以組成一些映射,但我希望避免大量的代碼發佈,以儘可能保持問題的有用性。對於其餘的類,只是string和int字段沒有什麼奇怪的。 – 2010-09-22 13:50:44

+0

只是想要一些我可以運行的東西,也想知道是否有一個屬性映射到Id,這會混淆nhibernate。 – 2010-09-22 13:52:30

回答

1

我的錯誤是由於數據庫中的數據類型爲long(int64),並映射到映射中的int(int32)。這意味着每當對象被保存時真實值都會改變,從而破壞標識符。感謝所有幫助過我的人。

4

我可以從代碼中指出的唯一的事情是更新現有實體使用Save

您可以避免顯式調用會話中存在的實體的Save方法。刷新會話時,您的更改將自動保留。

如果你堅持明確地調用更新方法,我會說你應該使用SaveOrUpdate

+0

謝謝,我正在使用存儲庫模式,所以我沒有真正調用保存。不知道是什麼原因造成的。 :) – 2010-09-22 14:13:12

+0

當我刪除私人setter的東西,我注意到ID字段是一個長數據類型。很明顯,「從1變爲1」的信息在這種情況下是有意義的,並且會成爲一個問題。現在我把它全部作爲int使用我的存儲庫模式工作正常。對不起,浪費你的時間:) – 2010-09-23 10:08:18

+0

沒問題:)很高興你終於搞清楚了。 – 2010-09-23 12:07:11

1

首先,讓財產上的二傳手私人;如果你有任何錯誤地設置它的代碼,該項目將無法編譯。無論如何,這是一個很好的做法。但這不是萬無一失的,因爲可能有類中的代碼設置它,所以你必須檢查它。

public int FileId { get; private set; } 

其次,仔細檢查映射文件以確保您沒有兩次映射該字段。

+0

需要爲protected NHibernate挑選它。 – rebelliard 2010-09-22 16:42:50

+0

不,它不。 NHibernate使用反射設置屬性,以便它可以訪問私人設置器。我使用身份密鑰的所有對象都有私人設置者。 – 2010-09-22 17:24:27

+0

嗯,試了一下,但它弄亂了很多其他的東西,我有很多其他項目的Id讀取寫入,沒有問題。 – 2010-09-23 09:40:35