簡體   English   中英

使用Fluent NHibernate映射自定義GUID

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM