我正在使用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?我怎么能克服这个?
答案 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。