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

C# 如何从Fluent NHibernate中的数据库char数据类型修剪字符串属性数据类型,c#,.net,nhibernate,orm,fluent-nhibernate,C#,.net,Nhibernate,Orm,Fluent Nhibernate,我有一个SQL数据库和一个具有相同模式的Oracle数据库 因此,我想对这两个数据库使用我的模型类,我要做的就是在Fluent NHibernate配置中更改数据库连接字符串 我有一些列的数据库字符数据类型,但在我的模型类中,我将它们设置为字符串,但是当它们从查询返回时,它们填充了空白 当我使用这些列查询数据库时,如何返回修剪后的列而不引起问题,因为它们需要匹配固定长度规范。SQL数据库中的字符数据类型用空格填充 如果可以修改数据库,则可以创建修剪列的视图。但是修剪的值与未修剪的值不匹配。(即,

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

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

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


当我使用这些列查询数据库时,如何返回修剪后的列而不引起问题,因为它们需要匹配固定长度规范。

SQL数据库中的字符数据类型用空格填充

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


如果我站在你的立场,我想我会缓存数据库包含的值。(也就是说,我会将其存储在某种变量中。)我可能会对其进行修剪以显示给用户,但是,我的应用程序代码和数据库之间的任何交互都将使用数据库中的实际值来完成。

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

在fluent映射中,您只需添加
.CustomType
,其中
T
是您的
IUserType
实现

有助于正确实现
IUserType
。不要挂断像
组装
反汇编
深度复制
替换
,这样的方法--看起来你甚至不会碰到它们。您最关心的是
NullSafeGet
,您将在其中进行修剪,而
NullSafeSet
将在其中进行填充

更新 进一步考虑后,我不确定在插入数据库时是否需要重新填充值——db本身将强制执行列的固定长度

作为对您在评论中提供的链接的回应,我认为实现基本上可以让您达到目的,但我确实认为您可能需要对其进行一些修改。首先,您可能不希望同时修剪前导空格和尾随空格,就像
trim()
所做的那样。另一方面,在重写
Equals
时,您需要

相等

价值观


我找到了这个。你认为它会起作用吗?你对Equals的建议与链接中的建议有何不同?@Jon抱歉,我的空格被标记解析丢失了。我的意思是,您希望“value”被认为是相等的,即使它被填充到列长度。在数据库中,dbms将强制执行“value”和“value”不相等的事实。应用程序代码假定这两个值相等是否安全取决于应用程序。(这意味着这里的任何人都很难或不可能在回答这个问题时给你很大的帮助。)如果我是你,我在这里会非常谨慎——和你的DBA谈谈。我发布的链接在trims上测试过,它从数据库返回时,以及它设置到数据库时。在person name=“John”而不是“John”的位置进行搜索似乎是可行的,即返回我找到的数据。你认为它会起作用吗?大概请参阅以上Jon的评论以及我的警告。@Catcall谢谢。在我问之前就解决了我的问题!
     value