NHibernate - преобразование не удалось при преобразовании даты и времени из двоичной / varbinary строки - PullRequest
0 голосов
/ 29 января 2010

Обратите внимание, это какая-то древняя установка NHibernate! У меня есть следующий класс NHibernate:

[Serializable]
[Class(Table = "SomeEvents")]
public class SomeEvent
{
    [Property(Column="processDate")]
    public DateTime? ProcessDate { get; set; }
}

При попытке обновить некоторые события, такие как:

using (ISession session = FDK_Hibernate_Manager.OpenSession())
{
    IQuery query = session.CreateQuery(string.Format("FROM {0} e WHERE e.ContractId = :cid", typeof(ContractLeverconditiesEvent)));
    query.SetInt32("cid", contractId);

    foreach(var evnt in query.List().Cast<SomeEvent>())
    {
        evnt.ProcessDate = DateTime.Now;
        session.SaveOrUpdate(evnt);
    }

    session.Flush();
}

Я получаю следующее исключение:

Ошибка преобразования при преобразовании даты и времени из двоичной / varbinary строки.

Так что я в основном предполагаю, что NHibernate еще не понимает мой DateTime?. Моя установка NHibernate не имеет фантазии Nullables.NHibernate.NullableDateTimeType. Итак, у кого-нибудь есть ключ к решению этой древней проблемы NHibernate?

Ответы [ 2 ]

1 голос
/ 29 января 2010

Я закончил с этим (хотя это может потребовать некоторой работы по проверке ошибок и тому подобное: -))

Реализуйте это, используя [Property(Column = "processDate", TypeType = typeof(NullableDateTime))]

class NullableDateTime : IUserType
{
    #region IUserType Members

    public new bool Equals(object obj, object obj2)
    {
        return false;
    }

    public override int GetHashCode()
    {
        return base.GetHashCode();
    }

    public object DeepCopy(object value)
    {
        return value;
    }

    public bool IsMutable
    {
        get { return true; }
    }

    public object NullSafeGet(System.Data.IDataReader rs, string[] names, object owner)
    {
        object o = rs[names[0]];
        if (o == DBNull.Value) return new Nullable<DateTime>();
        else
            return new Nullable<DateTime>(((System.Data.SqlTypes.SqlDateTime)o).Value);
    }

    public void NullSafeSet(System.Data.IDbCommand cmd, object value, int index)
    {
        System.Data.Common.DbParameter parameter = (System.Data.Common.DbParameter)cmd.Parameters[index];
        if (value == null)
        {
            parameter.Value = DBNull.Value;
            return;
        }
        else
        {
            parameter.Value = new System.Data.SqlTypes.SqlDateTime((DateTime)value);
        }
    }

    public Type ReturnedType
    {
        get { return this.GetType(); }
    }

    public NHibernate.SqlTypes.SqlType[] SqlTypes
    {
        get { return new NHibernate.SqlTypes.SqlType[] { new SqlDateTimeType() }; }
    }

    #endregion
}


public class SqlDateTimeType : NHibernate.SqlTypes.SqlType
{
    public SqlDateTimeType() : base(System.Data.DbType.DateTime)
    {
    }
}
0 голосов
/ 29 января 2010

К сожалению, вам, вероятно, придется использовать значение прокси (магическое число) для нулевой даты. 01.01.1900 - это общий выбор. Если вы можете отобразить закрытый член (я не использую атрибуты), вы можете контролировать значение через открытое свойство:

public class SomeEvent
{
    private DateTime _processDate; // map this

    public SomeEvent()
    {
        _processDate = new DateTime(1900, 1, 1);
    }

    public DateTime? ProcessDate
    {
        get
        {
            if (_processDate == new DateTime(1900, 1, 1))
            {
                return null;
            }
            return _processDate;
        }
        set
        {
            _processDate = value ?? new DateTime(1900, 1, 1);
        }
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...