如何从Fluent NHibernate中的数据库char数据类型中修剪字符串属性数据类型

时间:2011-01-10 21:53:29

标签: c# .net nhibernate orm fluent-nhibernate

我有一个SQL数据库和一个具有相同模式的Oracle数据库。

因此我想将我的模型类用于两个数据库,我将要做的就是更改Fluent NHibernate配置中的数据库连接字符串。

我有一些列的数据库字符数据类型,但在我的模型类中,我将它们设置为字符串,但是当它们从查询返回时,它们填充了空格。

当我使用这些列查询数据库时,如何在不引起问题的情况下返回它们,因为它们需要与固定长度规范相匹配。

2 个答案:

答案 0 :(得分:5)

您可以创建NHibernate.UserTypes.IUserType的实现,该实现将在从数据库中提取时修剪空白,并在返回数据库时重新填充它。

在您的流畅映射中,您只需添加.CustomType<T> TIUserType实施。

This article有助于正确实施IUserType。不要挂在像AssembleDisassembleDeepCopyReplace这样的方法上 - 看起来你甚至都不会遇到这些。你最关心的是你会修剪的NullSafeGet,以及你将重新填充的NullSafeSet

更新

经过进一步考虑,我不确定在插入数据库时​​你实际上是否需要重新填充值 - 数据库本身将强制执行固定长度的列。

为了回应您在评论中提供的链接,我认为实现几乎可以帮助您,但我认为您可能需要对其进行一些修改。首先,您可能不想修剪前导和尾随空格,因为Trim()会这样做。另一方面,在覆盖Equals时,您需要

     value

等于

  

答案 1 :(得分:3)

SQL数据库中的char数据类型用空格填充。

如果可以修改数据库,则可以创建修剪列的视图。但修剪后的值与未修剪的值不匹配。 (在SQL查询中,即。)TRIM()是标准SQL函数,但并非所有平台都支持它。我想你可以将它转换为VARCHAR();我不确定我是否曾经尝试过。

如果我在你的鞋子里,我想我会逐字地缓存数据库所包含的值。 (也就是说,我将它存储在某种变量中。)我可能会修改它以显示给用户,但我的应用程序代码和数据库之间的任何交互都将使用数据库中的实际值完成。