2011-12-23 13 views
1

如果在db中有char(5)列并且那里有“ABC”,如果将此列映射到字符串属性,您会发现nhibernate会将其映射为“ABC__”,其中下划线表示的是某种(我没有检查过它是什么ascii代码)有谁知道如何使nhibernate映射char(n)列为字符串而不添加尾随空格?

很长一段时间,现在我们通过将列更改为varchar并修剪数据库中的所有条目来解决此问题。如果有一个解决方案让我们将列保留为char(n)(如果只是为了节省我们的一些工作)会更好一些。(

我想我可以尝试在get和padding上修剪,但那并不是'不要让我成为最大的解决方案。

那么,有没有一些不错的方法来配置nhibernate读取char(n)列到一个字符串,而没有它读额外的空白?

谢谢!

回答

3

是和否。您可以使用字段标签上的公式属性将值设置为RTrim(myCharField),但不会绑定它。也就是说,您对该字段所做的任何更改都不会保存到数据库中。

我真的不明白为什么这是一个问题,但。如果你正在用数据层设计你的应用程序,它应该很简单,在返回它之前添加一个修剪调用到实体属性的getter方法之前?

+0

修剪到get是不够的,有时如果您将属性读入某个用户可编辑字段(如datagridview),则修剪后的值会重新设置为set,并且会话被刷新无用的更新语句将被创建 – 2011-12-23 23:09:41

+0

尽管如此,我只是在想,我可以确保将所有进入该设置的值都放回原来的位置。我只是希望有一些不可思议的方式来配置能够阻止我每次都这样做的事情。 – 2011-12-23 23:11:03

+0

“如果会话被刷新无用的更新语句得到创建”除非你的应用程序中有些事情会自动保存实体(与用户点击某个按钮相反),否则无用更新的数量将变得相当可观。用户将不得不打开该实体,不做任何更改并单击保存。我不认为这经常发生。 – 2011-12-23 23:15:01

0

我不确定你使用的是哪个数据库,但是我们使用iSeries DB2,而且我们对于尾随空格也有同样的问题。我们创建了一个自定义用户类型来“修剪”来自这些列的值:TrimmedUser.cs gist

这很有效,因为在进行字符串比较时(即'MYSTRING'等于'MYSTRING'),iSeries DB2不考虑尾部空白。如果您的特定数据库不适用,则可以在“NullSafeSet”方法中处理该问题,方法是使用数据库使用的空白字符进行填充。

相关问题