[英]Mapping custom GUID with Fluent NHibernate
我正在使用Fluent NHibernate映射Oracle數據庫。 這是一個舊數據庫,因此我無法真正更改我想要的所有內容。
有一個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:序列不存在
是我不使用序列生成GUID的問題嗎? 我該如何克服?
“正常”使用Guid在您的實體中,Id的類型應為Guid:
public virtual Guid Id { get; private set; }
並且在您的ClassMap中,您應該像這樣映射它:
Id(x => x.Id) .Column("Id") .GeneratedBy.GuidComb();
這將使用推薦的梳狀算法生成新的引導。
要么
Id(x => x.Id) .Column("Id") .GeneratedBy.Guid();
使用System.Guid生成新的Guid或
Id(x => x.Id) .Column("Id") .GeneratedBy.GuidNative();
如果要讓數據庫為您生成Guid。
編輯:CompositeId沒有我想的GeneratedBy方法,問題的根源可能是KeyReference方法的映射。 檢查Well類映射以確保將其設置為已分配,因為沒有本地標識(對於您的情況是Oracle序列)對該ID有效。
您需要告訴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();
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.