用Fluent NHibernate映射自定义GUID
本文关键字:自定义 GUID 映射 NHibernate Fluent | 更新日期: 2023-09-27 18:17:00
我正在使用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?我该如何克服?
使用Guids "normal "在你的实体中,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生成新的Guids。Guid或者
Id(x => x.Id)
.Column("Id")
.GeneratedBy.GuidNative();
如果您想让数据库为您生成Guid
编辑:CompositeId没有我认为的GeneratedBy方法,问题的根源可能是KeyReference方法的映射。检查Well类映射以确保它被设置为assigned,因为没有本地标识(在您的情况下是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();