문제

이것은 hibernate.org 포럼 및 Nhusers 목록에 많은 운이없는 목록에 게시되었으므로 여기서 시도 할 것이라고 생각했습니다.

간단히 말해, 수업이 있다고 가정 해 봅시다 :

class A
{
   public virtual object SomeValue { get; set; }
}

value 유형은 기본적으로 .NET 아이콘 광고 가능 유형 (bool, byte, char, int16, double, float 등), 바이트 [] 및 문자열 세트에 있습니다.

나는 이것을 반영하기 위해 nhibernate 매핑을 만들려고 노력하고 있습니다. 기본적으로 위의 유형 중 하나의 값을 기본적으로 설정하고 나중에 검색 할 수 있습니다. 그런 다음 제 Appogic은이를 반영하여 유형을 찾고 그에 따라 행동합니다.

지금까지 나는 이것을 시도하고 처리하기 위해 iusertype의 구현을 만들려고 노력했습니다. 그러나 나는 sqltype [] sqltypes를 위해 무엇을 반환 해야할지 모르겠습니다. 나는 새로운 sqltype (dbtype.object)를 고려했지만 이것에서 스키마를 생성하려고 할 때 시스템을 얻습니다. ArgumentException : Divelect는 dbtype.object를 지원하지 않습니다.

다른 데이터 유형을 시도하면 유형을 변환하려고 할 때 다양한 캐스트 예외를 얻습니다. 예를 들어 DBTYPE.BINARY를 사용하고 int32에 약간의 값을 설정하면 COMMING을 시도하면 System.InvalidCastException : 'System.int32'타입 'System.Byte []'의 객체를 캐스팅 할 수 없습니다.

이것을 달성 할 수있는 방법이 있습니까?

iusertype의 비 작업 구현을 위해 아래 첨부 된 코드 ( http://intellect.dk/post/implementing-custom-types-in-nhibernate.aspx )

public class DataElementType : IUserType

    {
        SqlType baseType = new SqlType(DbType.Binary);
        public SqlType[] SqlTypes
        {
            get
            {
                return new[] { baseType };
            }
        }

        public System.Type ReturnedType
        {
            get { return typeof(object); }
        }

        public new bool Equals(object x, object y)
        {
            if (x == null)
                return false;
            else
                return x.Equals(y);
        }

        public int GetHashCode(object x)
        {
            return x.GetHashCode();
        }

        public object NullSafeGet(IDataReader rs, string[] names, object owner)
        {
            return rs[names[0]];
        }

        public void NullSafeSet(IDbCommand cmd, object value, int index)
        {
            var param = new SQLiteParameter(baseType.DbType, value);
            cmd.Parameters.Insert(index, param);
        }

        public object DeepCopy(object value)
        {
            if (value == null) return null;
            return value;
        }

        public bool IsMutable
        {
            get { return false; }
        }

        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;
        }
    }
도움이 되었습니까?

해결책

SQLType (dbtype.object)의 문제를 해결하는 것이 방언에 의해 지원되지 않는 것으로 밝혀졌습니다.

public class SQLiteDialectWithManifestTyping : SQLiteDialect
{
    public SQLiteDialectWithManifestTyping() : base()
    {
        base.RegisterColumnType(DbType.Object, "NONE");
    }
}

이 방언을 유창하게 사용하려면 sqliteconfiguration 객체에서 Dialect ()을 호출하십시오. nhibernate에서 구성 속성 방언 Appropriatelly를 설정하십시오 (Ref Manual의 섹션 3.5.1 참조).

그런 다음 매핑에 위의 DataElementType 구현을 적용 할 수 있습니다 (SQLTypes 정의를 변경해야합니다.

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

메모:

  1. 완벽하지 않습니다. 모든 이산 숫자를 INT64로 향상시키고 두 배로 늘어나는 경향이 있습니다.

  2. 서명되지 않은 큰 값 (예 : ulong> = long.maxvalue의 값)을 저장하는 암시 적 방법은 없지만 이것은 일반적인 SQLite 문제입니다 (그리고 일반적인 ado.net 문제).

  3. 컴파일 시간을 잃어 버리기 때문에 값이 기본 유형인지 확인하기 위해 NullSafeset 방법에 런타임 검사를 입력하는 것이 바람직 할 수 있습니다. 일반 객체를 저장하려고 시도하면 객체 toString () 메소드가 호출되는 것입니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top