كيف يمكنك تعيين خاصية DateTime إلى أعمدة Varchar 2 في قاعدة البيانات مع Nhibernate (Fluent)؟

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

سؤال

أنا أتعامل مع قاعدة بيانات قديمة لها حقول تاريخ ووقت كأعمدة char (8) (تنسيق yyyymmdd و hh: mm: ss ، على التوالي) في بعض الجداول. كيف يمكنني تعيين أعمدة char 2 إلى خاصية .NET DateTime؟ لقد جربت ما يلي ، لكنني أحصل على خطأ "لا يمكن الوصول إلى" بالطبع لأن خصائص تاريخ DateTime و TimeOf-Day هي للقراءة فقط:

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 ، لكن لا يمكنني معرفة ذلك. لقد فعلت الكثير من googling للحصول على إجابة ، لكن لا يمكنني معرفة ذلك. ما هو أفضل خياري للتعامل مع هذا غبي اتفاقية قاعدة البيانات القديمة؟ سيكون مثال الرمز مفيدًا لأنه لا يوجد الكثير من الوثائق حول بعض هذه السيناريوهات الأكثر غموضًا.

هل كانت مفيدة؟

المحلول

تحتاج إلى 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