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

时间:2015-01-30 21:02:32

标签: c# oracle entity-framework odp.net

我正在使用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<Users>()
            .Property(u => u.UserName
            .IsFixedLength();

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

1 个答案:

答案 0 :(得分:0)

替换Oracle命令
SELECT * FROM users WHERE cast(user_name as varchar2(20)) = :p0

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