Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/290.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# NHibernate-从binary/varbinary字符串转换datetime时失败_C#_Nhibernate - Fatal编程技术网

C# NHibernate-从binary/varbinary字符串转换datetime时失败

C# NHibernate-从binary/varbinary字符串转换datetime时失败,c#,nhibernate,C#,Nhibernate,注意,这是一些古老的NHibernate装置!我有以下NHibernate课程: [Serializable] [Class(Table = "SomeEvents")] public class SomeEvent { [Property(Column="processDate")] public DateTime? ProcessDate { get; set; } } 尝试更新某些事件时,如: using (ISession session = FDK_Hibernate

注意,这是一些古老的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();
}
使用(ISession session=FDK\u Hibernate\u Manager.OpenSession())
{
IQuery query=session.CreateQuery(string.Format(“FROM{0}e,其中e.construcd=:cid”,typeof(ContractLeverconditiesEvent));
query.SetInt32(“cid”,缩写);
foreach(query.List().Cast()中的变量evnt)
{
evnt.ProcessDate=DateTime.Now;
session.SaveOrUpdate(evnt);
}
session.Flush();
}
我收到以下例外情况:

从binary/varbinary字符串转换datetime时失败


所以我基本上猜NHibernate还不明白我的
DateTime?
。我的NHibernate安装没有任何花哨的
Nullables.NHibernate.NullableDateTimeType
。那么,有没有人能找到解决这个古老的NHibernate问题的线索?

不幸的是,您可能必须为空日期使用代理值(幻数)。1900年1月1日是一个常见的选择。如果可以映射私有成员(我不使用属性),则可以通过公共属性控制值:

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);
        }
    }
}
我最终得到了这个结果(尽管它可能需要一些错误检查之类的工作:-))

使用
[属性(Column=“processDate”,TypeType=typeof(NullableDateTime))]实现它。

类NullableDateTime:IUserType
{
#区域类型成员
公共新布尔等于(对象obj、对象obj2)
{
返回false;
}
公共覆盖int GetHashCode()
{
返回base.GetHashCode();
}
公共对象深度复制(对象值)
{
返回值;
}
公共布尔可换
{
获取{return true;}
}
公共对象NullSafeGet(System.Data.IDataReader rs,字符串[]名称,对象所有者)
{
对象o=rs[名称[0]];
如果(o==DBNull.Value)返回新的Nullable();
其他的
返回新的Nullable(((System.Data.SqlTypes.SqlDateTime)o).Value);
}
public void NullSafeSet(System.Data.IDbCommand cmd,对象值,int索引)
{
System.Data.Common.DbParameter参数=(System.Data.Common.DbParameter)cmd.Parameters[index];
如果(值==null)
{
parameter.Value=DBNull.Value;
返回;
}
其他的
{
parameter.Value=new System.Data.SqlTypes.SqlDateTime((DateTime)值);
}
}
公共类型返回类型
{
获取{返回this.GetType();}
}
公共NHibernate.SqlTypes.SqlType[]SqlTypes
{
获取{return new NHibernate.SqlTypes.SqlType[]{new SqlDateTimeType()};}
}
#端区
}
公共类SqlDateTimeType:NHibernate.SqlTypes.SqlType
{
public SqlDateTimeType():base(System.Data.DbType.DateTime)
{
}
}

我总算把东西拼凑起来了:-)
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)
    {
    }
}