Как сопоставить свойство DateTime с 2 столбцами varchar в базе данных с помощью NHibernate (свободно)?

StackOverflow https://stackoverflow.com/questions/2526912

Вопрос

Я имею дело с устаревшей базой данных, которая содержит поля даты и времени в виде столбцов char (8) (в формате ГГГГМДД и ЧЧ: мм: сс соответственно) в некоторых таблицах.Как я могу сопоставить 2 столбца char с одним свойством .NET DateTime?Я пробовал следующее, но, конечно, получаю ошибку "не удается получить доступ к установщику", потому что свойства DateTime Date и TimeOfDay доступны только для чтения:

public class SweetPocoMannaFromHeaven
{    
    public virtual DateTime? FileCreationDateTime { get; set; }
}

.

mapping.Component<DateTime?>(x => x.FileCreationDateTime,
            dt =>
            {
                dt.Map(x => x.Value.Date,
                    "file_creation_date");
                dt.Map(x => x.Value.TimeOfDay,
                    "file_creation_time");
            });

Я также попытался определить IUserType для DateTime, но я не могу понять это.Я погуглил тонну в поисках ответа, но до сих пор не могу в нем разобраться.Каков мой наилучший вариант справиться с этим глупый устаревшее соглашение о базах данных?Пример кода был бы полезен, поскольку документации по некоторым из этих более неясных сценариев не так много.

Это было полезно?

Решение

Вам нужен ICompositeUserType для обработки более чем одного столбца.Вам нужно усилить проверку ошибок, синтаксический анализ форматов и т.д., Но вот отправная точка для вас.

HTH,
Беррил

public class LegacyDateUserType : ICompositeUserType
{

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

    public int GetHashCode(object x) {
        return x == null ? typeof (DateTime).GetHashCode() + 473 : x.GetHashCode();
    }

    public object NullSafeGet(IDataReader dr, string[] names, ISessionImplementor session, object owner)
    {
        if (dr == null) return null;

        var datePortion = NHibernateUtil.String.NullSafeGet(dr, names[0], session, owner) as string;
        var timePortion = NHibernateUtil.String.NullSafeGet(dr, names[1], session, owner) as string;

        var date = DateTime.Parse(datePortion);
        var time = DateTime.Parse(timePortion);
        return date.AddTicks(time.Ticks);
    }

    ///<summary>
    /// Write an instance of the mapped class to a prepared statement. Implementors 
    /// should handle possibility of null values. A multi-column type should be written 
    /// to parameters starting from index.
    ///</summary>
    public void NullSafeSet(IDbCommand cmd, object value, int index, ISessionImplementor session) {
        if (value == null) {
            // whatever
        }
        else {
            var date = (DateTime) value;
            var datePortion = date.ToString("your date format");
            NHibernateUtil.String.NullSafeSet(cmd, datePortion, index, session);
            var timePortion = date.ToString("your time format");
            NHibernateUtil.String.NullSafeSet(cmd, timePortion, index + 1, session);
        }
    }

    public object GetPropertyValue(object component, int property)
    {
        var date = (DateTime)component;
        return property == 0 ? date.ToString("your date format") : date.ToString("your time format");
    }

    public void SetPropertyValue(object component, int property, object value)
    {
        throw new NotSupportedException("DateTime is an immutable object.");
    }

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

    public object Disassemble(object value, ISessionImplementor session) { return value; }

    public object Assemble(object cached, ISessionImplementor session, object owner) { return cached; }

    public object Replace(object original, object target, ISessionImplementor session, object owner) { return original; }

    ///<summary>Get the "property names" that may be used in a query.</summary>
    public string[] PropertyNames { get { return new[] { "DATE_PORTION", "TIME_PORTION" }; } }

    ///<summary>Get the corresponding "property types"</summary>
    public IType[] PropertyTypes { get { return new IType[] { NHibernateUtil.String, NHibernateUtil.String }; } }

    ///<summary>The class returned by NullSafeGet().</summary>
    public Type ReturnedClass { get { return typeof(DateTime); } }

    ///<summary>Are objects of this type mutable?</summary>
    public bool IsMutable { get { return false; } }

}

=== свободное отображение (предполагается автоматическое отображение с переопределяемыми классами) ====

 public void Override(AutoMapping<MyClass> m)
 {
     ....
     m.Map(x => x.MyDateTime).CustomType<LegacyDateUserType>();
 }
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top