我正在使用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并洗手,但不幸的是,目前这不是一个选项。非常感谢您提供的任何帮助!
答案 0 :(得分:0)
用
替换Oracle命令SELECT * FROM users WHERE cast(user_name as varchar2(20)) = :p0
您可以使用CAST将大多数数据类型转换为Oracle中的大多数其他数据类型。 CHAR数据类型很难处理(由于某种原因已弃用)并将其转换为varchar2(xx)是最佳选择。