Castle ActiveRecord: сопоставление с IUserType с классом в C #

в моем текущем проекте я использую ActiveRecord Castle на C #. Для одной из моих таблиц мне нужно использовать класс настраиваемого типа (имеющий дело с глупым преобразованием времени в промежуток времени). Чтобы мой код оставался чистым, мне нравится определять класс, производный от IUserType в классе сопоставления объектов. Но я не могу найти способ сопоставить это свойство с помощью этого подкласса, ActiveRecord продолжает жаловаться: Could not determine type for (...)

Вот небольшой образец:

namespace testForActiveRecord
{
    [ActiveRecord("[firstTable]")]
    public class firstTable:ActiveRecordBase<firstTable>
    {
        private TimeSpan _TStest;

        // more private fields and properties here

        [Property(ColumnType = "testForActiveRecord.firstTable.StupidDBTimeSpan, testForActiveRecord")]
        public TimeSpan TStest
        {
            get { return _TStest; }
            set { _TStest = value; }
        }

        // Usertype doing the conversion from a date saved in the DB to the timespan it is representing
        // The TimeSpan is saved by an offset to the date 30.12.1899...
        public class StupidDBTimeSpan : IUserType
        {
            #region IUserType Member

            DateTime Basis = new DateTime(1899,12,30,00,00,00);

            object IUserType.Assemble(object cached, object owner)
            {
                return cached;
            }

            object IUserType.DeepCopy(object value)
            {
                return value;
            }

            object IUserType.Disassemble(object value)
            {
                return value;
            }

            bool IUserType.Equals(object x, object y)
            {
                if (x == y) return true;
                if (x == null || y == null) return false;
                return x.Equals(y);
            }

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

            bool IUserType.IsMutable
            {
                get { return false; }
            }

            public object NullSafeGet(System.Data.IDataReader rs, string[] names, object owner)
            {
                object obj = NHibernateUtil.DateTime.NullSafeGet(rs, names[0]);
                TimeSpan Differenz = new TimeSpan();
                if (obj != null)
                {
                    Differenz = (DateTime)obj - Basis;
                }
                return Differenz;
            }

            public void NullSafeSet(System.Data.IDbCommand cmd, object value, int index)
            {
                if (value == null)
                {
                    ((IDataParameter)cmd.Parameters[index]).Value = DBNull.Value;
                }
                else
                {
                    NHibernateUtil.DateTime.NullSafeSet(cmd, Basis + (TimeSpan)value, index);
                }
            }

            object IUserType.Replace(object original, object target, object owner)
            {
                return original;
            }

            Type IUserType.ReturnedType
            {
                get { return typeof(TimeSpan); }
            }

            NHibernate.SqlTypes.SqlType[] IUserType.SqlTypes
            {
                get { return new SqlType[] { new SqlType(DbType.DateTime) }; }
            }

            #endregion
        }
    }
}

Нет проблем, если класс StupidDBTimeSpan определен вне класса testForActiveRecord и я отображаю свойство с помощью [Property(ColumnType = "testForActiveRecord.StupidDBTimeSpan, testForActiveRecord")].

Что я делаю неправильно? Можно ли использовать эту конструкцию подкласса с ActiveRecord?

С уважением, sc911


person sc911    schedule 22.03.2010    source источник


Ответы (1)


Поскольку StupidDBTimeSpan является внутренним классом, имя типа CLR:

testForActiveRecord.firstTable+StupidDBTimeSpan, testForActiveRecord
person Mauricio Scheffer    schedule 22.03.2010
comment
Это решило это! Большое спасибо! Можете ли вы дать мне ссылку на всю документацию, которая ответит мне на эти вопросы? Потому что я не смог найти полную документацию по этому поводу ... - person sc911; 22.03.2010
comment
@ sc911: это довольно полно ...: msdn.microsoft.com/en -us / library / yfsftwz6.aspx - в противном случае typeof(xxx).FullName должен дать вам правильное имя типа. - person Lucero; 22.03.2010