- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我有旧版数据库,存储的日期表示无日期为9999-21-31,
列Till_Date
的类型为DateTime not-null="true"
。
在应用程序中,我要构建持久化类,将no-date表示为null,
所以我在C#// public DateTime中使用了可为空的DateTime? TillDate {获取;组; }
我创建了IUserType,它知道将实体null值转换为DB 9999-12-31
但似乎NHibernate不会在我的IUserType上调用SafeNullGet,SafeNullSet
当实体值为null且报告为null时,用于非null列。
我试图通过将列映射为not-null =“ false”来绕过它
(仅更改了映射文件,而不更改了数据库)
但是它仍然没有帮助,只是现在它尝试将null值插入数据库并获取ADOException。
是否知道NHibernate不支持将null转换为非null值的IUseType?
//实施所需的修复程序!!!
public class NullableDateTimeToNotNullUserType : IUserType
{
private static readonly DateTime MaxDate = new DateTime(9999, 12, 31);
public new bool Equals(object x, object y)
{ //This didn't work as well
if (ReferenceEquals(x, y)) return true; //if(x == null && y == null) return false;
if (x == null || y == null) return false;
return x.Equals(y);
}
public int GetHashCode(object x)
{
return x == null ? 0 : x.GetHashCode();
}
public object NullSafeGet(IDataReader rs, string[] names, object owner)
{
var value = rs.GetDateTime(rs.GetOrdinal(names[0]));
return (value == MaxDate)? null : value;
}
public void NullSafeSet(IDbCommand cmd, object value, int index)
{
var dateValue = (DateTime?)value;
var dbValue = (dateValue.HasValue) ? dateValue.Value : MaxDate;
((IDataParameter)cmd.Parameters[index]).Value = dbValue;
}
public object DeepCopy(object value)
{
return value;
}
public object Replace(object original, object target, object owner)
{
return original;
}
public object Assemble(object cached, object owner)
{
return cached;
}
public object Disassemble(object value)
{
return value;
}
public SqlType[] SqlTypes
{
get { return new[] { NHibernateUtil.DateTime.SqlType }; }
}
public Type ReturnedType
{
get { return typeof(DateTime?); }
}
public bool IsMutable
{
get { return false; }
}
}
}
//Make the column mapping in hbm.xml not-null="false" even if in DB null not allowed.
//Make sure the class mapping in xml doesn't have dynamic-insert="true"
public class NullableDateTimeToNotNullUserType : IUserType
{
private static readonly DateTime MaxDate = new DateTime(9999, 12, 31);
public new bool Equals(object x, object y)
{ //This didn't work as well
if (ReferenceEquals(x, y)) return true; //if(x == null && y == null) return false;
if (x == null || y == null) return false;
return x.Equals(y);
}
public int GetHashCode(object x)
{
return x == null ? 0 : x.GetHashCode();
}
public object NullSafeGet(IDataReader rs, string[] names, object owner)
{
var value = NHibernateUtil.Date.NullSafeGet(rs, names[0]);
return (value == MaxDate)? default(DateTime?) : value;
}
public void NullSafeSet(IDbCommand cmd, object value, int index)
{
var dateValue = (DateTime?)value;
var dbValue = (dateValue.HasValue) ? dateValue.Value : MaxDate;
NHibernateUtil.Date.NullSafeSet(cmd, valueToSet, index);
}
public object DeepCopy(object value)
{
return value;
}
public object Replace(object original, object target, object owner)
{
return original;
}
public object Assemble(object cached, object owner)
{
return cached;
}
public object Disassemble(object value)
{
return value;
}
public SqlType[] SqlTypes
{
get { return new[] { NHibernateUtil.DateTime.SqlType }; }
}
public Type ReturnedType
{
get { return typeof(DateTime?); }
}
public bool IsMutable
{
get { return false; }
}
}
}
最佳答案
您实施Equals
时可能会出现问题。 NHibernate使用Equals来确定是否需要获取或设置该值。请发布您的IUserType实现。
编辑:好的,我想我看到了问题。试试这个:
public object NullSafeGet(IDataReader rs, string[] names, object owner)
{
var value = NHibernateUtil.Date.NullSafeGet(rs, names[0]);
return (value == MaxDate) ? null : value;
}
public void NullSafeSet(IDbCommand cmd, object value, int index)
{
var dateValue = (DateTime?)value;
var dbValue = (dateValue.HasValue) ? dateValue.Value : MaxDate;
NHibernateUtil.Date.NullSafeSet(cmd, valueToSet, index);
}
关于nhibernate - NHibernate IUserType将可为空的DateTime转换为DB非空值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2513986/
我有这个实现 IUserType 的类: public class StringToIntType : IUserType { /// /// mutable
嗨,我想知道两者之间的区别,为什么要使用一种而不是另一种以及何时使用? 最佳答案 您的对象模型不一定与您的数据库模型一一对应,而且在大多数情况下会更丰富。组件是通过在对象模型中封装功能来丰富数据库模型
首先让我为这篇文章的长度道歉,虽然它主要是代码,所以我希望大家多多包涵! 我有一个处理遗留数据库的场景,我需要使用 NHibernate 3.2 编写一个 IUserType 来获取一个 2 个字符的
我使用 NHibernate 和 Postgresql 作为后端,并且必须创建自定义类型以将 System.DateTime 转换为 Postgresql“时间”类型以及将 System.TimeSp
我正在尝试通过代码获取使用 NHibernate (v3.3) 映射的自定义类型。我试着按照这个例子 here ,但没有运气。我试图实现的自定义类型是一种修剪来自数据库的字符串的类型。 我收到以下异常
我正在尝试为州和国家/地区代码实现 IUserType,这将允许我访问两个字母的代码(存储在数据库中的内容)以及全名。我遵循 NHibernate 3.0 Cookbook(第 225 页)中的示例,
我有一个 LocalizedString 类,用于存储单个值的本地化。这个概念大致基于 post by Fabio Maulo . 我在 NHibernate 3.2 中使用新的 Mapping-By
我如何在 NHibernate 中构建针对自定义 IUserType 字段的查询? 更具体地说:我正在处理一个棕地应用程序。我在数据库中有一个名为“State”的字段,其中包含一个表示给定对象所处状态
在执行如下 NHibernate Linq 查询时是否可以防止此异常: var dateFilter = DateTime.Parse("1500-01-01"); return _session.Q
我们有一个主要对应于 System.Int64 的自定义类型,用于我们的系统标识符(它对潜在的长值可以是什么提供了一些额外的限制)。 我们还定义了一个 IUserType 以允许我们将此类型的属性映射
在我的项目中,我使用 IUserType (BooleanM1) 来处理 bool 值并将 -1 表示为真,0 表示为假值写入数据库。到目前为止一切正常。映射看起来像这个: 所以如果我做如下查询 v
对于我当前的项目,我在 C# 中使用 CaSTLe 的 ActiveRecord。对于我的一张表,我确实需要使用自定义类型类(处理愚蠢的时间到时间跨度的转换)。为了保持我的代码干净,我喜欢在对象映射类
我正在尝试创建一个 NHibernate IUserType野田时间LocalTime逻辑上映射到 time 的类型输入 Sql Server 2008/2012。我能够从数据库中保存和加载值。但是,
我是一名优秀的程序员,十分优秀!