2011-12-06 54 views
0

我使用Fluent NHibernate映射Oracle數據庫。這是一個遺留數據庫,所以我不能真正改變我想要的一切。使用流利NHibernate映射自定義GUID

有一個GUID字段,但鍵仍然是複合的(我會盡快更改此鍵,使鍵不復合,但我現在不能這樣做)。 GUID是具有此佈局的VARCHAR2字段:551608b1-275d-49f6-9561-44d01aacf23f。的GUID不是由Oracle中的序列添加,但是從代碼(C#或VB.net)

Guid.NewGuid() 

插入一地圖這樣的鍵(VB.net):

With CompositeId() 
    .KeyReference(Function(x) x.Well, "WellID") 
    .KeyProperty(Function(x) x.GUID, "GUID") 
    .KeyProperty(Function(x) x.SetDate, "SET_DATE") 
End With 

或者像這在C#

CompositeId() 
    .KeyReference(x => x.Well, "WellID") 
    .KeyProperty(x => x.GUID, "GUID") 
    .KeyProperty(x => x.SetDate, "SET_DATE"); 

映射工作很好,對象都是我想要的,直到我需要保存。

當我嘗試保存或更新未改變對象

m_Session.SaveOrUpdate(obj) 

我得到:ORA-02289: sequence does not exist

是,我不使用序列來生成我GUID的問題?我該如何克服這一點?

+0

如果鍵不合成,這會更簡單嗎? –

回答

0

編輯: CompositeId沒有GeneratedBy方法,因爲我認爲問題的根源可能是KeyReference方法的映射。檢查Well類映射以確保它被設置爲分配,因爲沒有本地標識(在您的情況下爲Oracle序列)對該標識有效。

你需要告訴NHibernate你正在爲該實體手動分配Id。嘗試像下面顯示的映射。 當然,當您創建此實體的新實例時,需要爲您的代碼中的GUID & SetDate設置適當的值。您還需要將適當的Well類實例分配給Well屬性。

CompositeId() 
    .KeyReference(x => x.Well, "WellID") 
    .KeyProperty(x => x.GUID, "GUID") 
    .KeyProperty(x => x.SetDate, "SET_DATE") 
    .GeneratedBy.Assigned(); 
+0

我知道我可以爲ID做這件事,但是我也可以爲CompositeID做這件事嗎? Id(x => x.GUID,「GUID」)。GeneratedBy.Assigned(); –

+0

哦!對CompositeId做了一個壞的假設,就像NHibernate中的Id一樣。我編輯了這個問題。 –

0

使用的GUID 「正常」 在實體ID應該是類型的Guid:

public virtual Guid Id { get; private set; } 

而在你的類映射,你應該這樣它映射:

Id(x => x.Id) .Column("Id") .GeneratedBy.GuidComb();

這將使用推薦的梳子算法來生成新的GUID。使用的System.Guid 或

Id(x => x.Id) .Column("Id") .GeneratedBy.GuidNative();

,如果你想要讓數據庫生成的GUID爲您

Id(x => x.Id) .Column("Id") .GeneratedBy.Guid();

到genertae新的GUID。