C# Fluent NHibernate将非Id Guid映射到Oracle
我正在尝试将不是Id属性的Guid映射到Oracle CLOB列 在MsSQL中,我可以将Guid映射到C# Fluent NHibernate将非Id Guid映射到Oracle,c#,oracle,asp.net-mvc-4,nhibernate,fluent-nhibernate,C#,Oracle,Asp.net Mvc 4,Nhibernate,Fluent Nhibernate,我正在尝试将不是Id属性的Guid映射到Oracle CLOB列 在MsSQL中,我可以将Guid映射到UniqueIdentifier列,如下所示: Map(x => x.Guid).Column("my_guid").CustomType<GuidType>(); 但是,在Oracle中尝试使用适用于MsSQL的相同映射将Guid映射到CLOB时,它总是插入空值 如果可以像映射Guid Id字段一样解决此问题,将非常方便: Id(x => x.Id).Column(
UniqueIdentifier
列,如下所示:
Map(x => x.Guid).Column("my_guid").CustomType<GuidType>();
但是,在Oracle中尝试使用适用于MsSQL的相同映射将Guid映射到CLOB时,它总是插入空值
如果可以像映射Guid Id字段一样解决此问题,将非常方便:
Id(x => x.Id).Column("my_guid").GeneratedBy.GuidComb();
我真的找不到一个好的方法来做到这一点,然而,我已经想出了一个可行的解决方案 如果我们在Oracle中创建一列,其数据类型为
非NULL VARCHAR2(32)DEFAULT SYS_GUID()
,这将在插入记录时处理GUID的生成
但是,Oracle生成的Guid没有连字符,因此我们得到的东西看起来像EF8FDA432CB340ADE0434C687B89F91C
不幸的是,正因为如此,我不得不创建自己的IUserType
实现,以处理将带有连字符的Guid转换为存储为不带连字符的VARCHAR2(32)
的Oracle Guid。实施情况如下:
[Serializable]
public class OracleGuidType : IUserType
{
SqlType[] sqlTypes;
public OracleGuidType()
{
// We use DbType.String here because we are storing as a varchar
sqlTypes = new[] { SqlTypeFactory.GetSqlType(DbType.String, 0, 0) };
}
public SqlType[] SqlTypes
{
get { return sqlTypes; }
}
public Type ReturnedType
{
get { return typeof(Guid); }
}
public object NullSafeGet(IDataReader rs, string[] names, object owner)
{
if (rs[names[0]] == DBNull.Value)
{
return Guid.Empty;
}
return new Guid(rs[names[0]].ToString());
}
public void NullSafeSet(IDbCommand cmd, object value, int index)
{
var param = (IDataParameter)cmd.Parameters[index];
param.DbType = sqlTypes[0].DbType;
var guid = (Guid)value;
if (guid != Guid.Empty)
{
// This line removes hyphens
param.Value = guid.ToString("N").ToUpper();
}
else
{
param.Value = DBNull.Value;
}
}
public bool IsMutable
{
get { return false; }
}
public object DeepCopy(object value)
{
return value;
}
public object Replace(object original, object target, object owner)
{
return original;
}
public object Assemble(object cached, object owner)
{
return cached;
}
public object Disassemble(object value)
{
return value;
}
public new bool Equals(object x, object y)
{
return x != null && x.Equals(y);
}
public int GetHashCode(object x)
{
return x.GetHashCode();
}
}
我的NHibernate映射定义为:
Map(x => x.Guid).Column("my_guid").Generated.Insert().CustomType<OracleGuidType>();
Map(x=>x.Guid).Column(“我的Guid”).Generated.Insert().CustomType();
太棒了!这对我有用。我正在使用nhibernate类映射映射一个非ID Guid类型。
Map(x => x.Guid).Column("my_guid").Generated.Insert().CustomType<OracleGuidType>();