假如你在db中有一个char(5)列并且你有“ABC”,如果你把这个列映射到一个字符串属性,你会发现nhibernate将它映射为“ABC__”,其中下划线代表空格某种(我没有检查它是什么ascii代码)
很长一段时间以来,我们通过将列更改为varchar并修剪数据库中的所有条目来解决此问题。如果有一个解决方案让我们将列保持为char(n)(如果只是为了节省我们的工作),那会更好。
我想我可以尝试修剪设置上的get和padding,但这并不是我最好的解决方案。
那么,是否有一些很好的方法来配置nhibernate以将char(n)列读入字符串而不读取额外的空格?
谢谢!
答案 0 :(得分:3)
是和否。您可以在字段标记上使用公式属性将值设置为RTrim(myCharField),但不会绑定它。也就是说,您对该字段所做的任何更改都不会保存到数据库中。
我真的不明白为什么这是一个问题。如果您正在使用数据层设计应用程序,那么它应该足够简单,可以在返回之前向实体属性的getter方法添加一个trim调用,不应该吗?
答案 1 :(得分:0)
我不确定您使用的是哪个数据库,但我们使用的是iSeries DB2,并且我们在跟踪空格时遇到了同样的问题。我们为" trim"创建了一个自定义用户类型。这些列中的值:TrimmedUser.cs gist
这是有效的,因为iSeries DB2在进行字符串比较时并不考虑尾随空格(即“MYSTRING' equals' MYSTRING'”)。如果您的特定数据库不是这样,那么您可以在" NullSafeSet"中处理它。方法,通过右边填充数据库使用的空白字符。
答案 2 :(得分:0)
这是Andy的要旨的更新版本:
public class TrimmedString : NHibernateFactoryType<string>
{
public override SqlType[] SqlTypes => new[] { new SqlType(DbType.AnsiStringFixedLength) };
public override object NullSafeGet(DbDataReader rs, string[] names, ISessionImplementor session, object owner)
{
var str = (string)NHibernateUtil.String.NullSafeGet(rs, names[0], session);
return str?.Trim();
}
public override void NullSafeSet(DbCommand cmd, object value, int index, ISessionImplementor session)
{
value = ((string)value)?.Trim(); //Not really necessary
NHibernateUtil.String.NullSafeSet(cmd, value, index, session);
}
}