C# Fluent NHibernate将非Id Guid映射到Oracle

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(

我正在尝试将不是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("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>();