ODP.NET / EF6 – WHERE子句中的CHAR数据类型

我正在使用EF6和ODP.NET开始一个项目,我在基于固定长度的CHAR列执行查找时遇到了麻烦。

即使此用户存在于数据库中,以下代码也不返回任何结果。

using (var context = new Entities()) { var search = "testuser"; var result = context.Users .Where(u => u.UserName == search) .FirstOrDefault(); } 

我知道我可以通过填充搜索字符串或修剪数据库列来解决这个问题,但我正在寻找替代解决方案。

我注意到如果我使用OracleConnection / OracleCommand直接执行查询,那么它可以工作。 是否有一个属性或任何我可以添加到实体类以使ODP.NET将变量绑定为OracleDbType.Char?

基本上,我正在寻找一种从EF6重现以下行为的方法:

 var cmd = new OracleCommand("SELECT * FROM users WHERE user_name = :p0", conn); cmd.Parameters.Add(":p0", OracleDbType.Char).Value = "testuser"; 

我还使用Devart的dotConnect Oracle驱动程序进行了测试。 使用该驱动程序,我可以通过添加以下代码行成功查找。 不过,我更喜欢在dotConnect上使用ODP.NET。 似乎ODP.NET忽略了这个属性,因为它在使用ODP.NET时没有任何效果。 ODP.NET会识别出与此类似的东西吗?

 modelBuilder.Entity() .Property(u => u.UserName .IsFixedLength(); 

如果可以,我只会将列类型更改为VARCHAR2并洗手,但不幸的是,目前这不是一个选项。 您将提供的任何帮助将非常感谢!

用。替换Oracle命令

 SELECT * FROM users WHERE cast(user_name as varchar2(20)) = :p0 

您可以使用CAST将大多数数据类型转换为Oracle中的大多数其他数据类型。 CHAR数据类型很难处理(由于某种原因而被弃用)并将其转换为varchar2(xx)是最佳选择。