可以在nhibernate中使用sqlite清单类型功能吗?

可以在nhibernate中使用sqlite清单类型功能吗?,nhibernate,sqlite,nhibernate-mapping,system.data.sqlite,Nhibernate,Sqlite,Nhibernate Mapping,System.data.sqlite,这是发布在hibernate.org论坛和nhusers列表上的,运气不好,所以我想我会在这里试试 简单地说,假设我有一个类: class A { public virtual object SomeValue { get; set; } } SomeValue的类型基本上是一组.NET IConvertible类型(原语,如bool、byte、char、int16、double、float等),加上byte[]和string 我正在尝试为创建一个nhibernate映射来反映这一点,这

这是发布在hibernate.org论坛和nhusers列表上的,运气不好,所以我想我会在这里试试

简单地说,假设我有一个类:

class A
{
   public virtual object SomeValue { get; set; }
}
SomeValue的类型基本上是一组.NET IConvertible类型(原语,如bool、byte、char、int16、double、float等),加上byte[]和string

我正在尝试为创建一个nhibernate映射来反映这一点,这样我就可以基本上为任意对象(上述类型之一)设置一些值,并在以后检索它。然后,我的applogic将对其进行反思,以找到类型并相应地进行操作

到目前为止,我已经尝试创建一个IUserType实现来尝试和处理这个问题。但是,我不知道要为SqlType[]SqlTypes返回什么。我考虑了新的SqlType(DbType.Object),但当我试图从中生成一个模式时,我得到了一个System.ArgumentException:方言不支持DbType.Object

如果尝试另一种数据类型,则在尝试转换该类型时会出现各种强制转换异常。例如,如果我使用DbType.Binary,并将someValue设置为int32,在尝试提交时,我会获得System.InvalidCastException:无法将类型为“System.int32”的对象强制转换为类型为“System.Byte[]”

有没有办法做到这一点

以下附加的IUserType非工作实现代码(基于)


为了解决方言不支持SqlType(DbType.Object)的问题,我们通过使用显式支持子类化SqliteDialogue来支持它:

public class SQLiteDialectWithManifestTyping : SQLiteDialect
{
    public SQLiteDialectWithManifestTyping() : base()
    {
        base.RegisterColumnType(DbType.Object, "NONE");
    }
}
要在Fluent中使用此方言,请在SQLiteConfiguration对象上调用方言()。在NHibernate中,适当设置配置属性方言(参见参考手册第3.5.1节)

然后,我们可以为映射应用上述DataElementType实现(需要将SqlTypes定义更改为:

    public SqlType[] SqlTypes
    {
        get
        {
            return new[] { new SqlType(DbType.Object) };
        }
    }
注:

  • 它不是完美的。有一种趋势是将所有离散的数字向上转换为Int64,并将浮点数翻倍

  • 没有隐式方法存储大的无符号值(例如,ulong>=long.MaxValue的值),但这是一个一般的sqlite问题(可能是一个一般的ado.net问题?)

  • 由于缺少编译时检查,可能需要在NullSafeSet方法中进行一些运行时检查,以确保值是基元类型。尝试存储常规对象似乎只会导致调用objects ToString()方法


  • 为了解决方言不支持SqlType(DbType.Object)的问题,我们通过使用显式支持子类化SqliteDialogue来支持它:

    public class SQLiteDialectWithManifestTyping : SQLiteDialect
    {
        public SQLiteDialectWithManifestTyping() : base()
        {
            base.RegisterColumnType(DbType.Object, "NONE");
        }
    }
    
    要在Fluent中使用此方言,请在SQLiteConfiguration对象上调用方言()。在NHibernate中,适当地设置配置属性方言(请参阅参考手册第3.5.1节)

    然后,我们可以为映射应用上述DataElementType实现(需要将SqlTypes定义更改为:

        public SqlType[] SqlTypes
        {
            get
            {
                return new[] { new SqlType(DbType.Object) };
            }
        }
    
    注:

  • 它不是完美的。有一种趋势是将所有离散的数字向上转换为Int64,并将浮点数翻倍

  • 没有隐式方法存储大的无符号值(例如,ulong>=long.MaxValue的值),但这是一个一般的sqlite问题(可能是一个一般的ado.net问题?)

  • 由于缺少编译时检查,可能需要在NullSafeSet方法中进行一些运行时检查,以确保值是基元类型。尝试存储常规对象似乎只会导致调用objects ToString()方法


  • 哦…你在尝试做一些棘手的事情。好运:你在冒险进入复杂的水域。哦…你在尝试做一些棘手的事情。好运:你在冒险进入复杂的水域。