Замок ActiveRecord: Карта IUserType с классом в C # - PullRequest
2 голосов
/ 22 марта 2010

для моего текущего проекта я использую ActiveRecord Касла в 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

1 Ответ

1 голос
/ 22 марта 2010

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

testForActiveRecord.firstTable+StupidDBTimeSpan, testForActiveRecord
...