使用Fluent NHibernate映射自定义GUID

时间:2011-12-06 13:27:56

标签: c# vb.net fluent-nhibernate guid

我正在使用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: sequence does not exist

问题是我不使用序列来生成我的GUID?我怎么能克服这个?

2 个答案:

答案 0 :(得分:0)

编辑: CompositeId没有我想的GeneratedBy方法,问题的根源可能是KeyReference方法的映射。检查Well类映射以确保将其设置为已分配,因为没有本机标识(在您的情况下为Oracle序列)对该id有效。

您需要告诉NHibernate您是否为该实体手动分配了Id。尝试下面显示的映射。当然,当你创建这个实体的新实例时, 需要为GUID&设置适当的值。在您的代码中设置日期。您还需要将适当的Well类实例分配给Well属性。

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

答案 1 :(得分:0)

正常使用Guids“ 在您的实体中,Id应为Guid类型:

public virtual Guid Id { get; private set; }

在你的ClassMap中你应该像这样映射它:

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

这将使用推荐的梳理算法生成新的guid。

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

使用System.Guid创建新Guids 或

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

如果你想让数据库为你生成Guid。