我拥有最新版本的Oracle数据访问组件(ODAC)(12.1.0.1.0),并且首先将它与EF 5数据库一起使用。
在我的数据库中我有一个RAW类型的字段(16) 当数据保存到数据库中时,格式为大写,没有任何破折号(例如:A0D8F7E720DDBF4296C932F7A730A635)。
我尝试在此GUID字段上使用where子句查询实体,但无法获得任何结果。我们的where子句看起来像这样(C#)
Context.Users.where(x=>x.GuidField == anotherGuid);
两个变量都是GUID类型。
GuidField字段是数据库中的RAW(16),但实体框架将其映射为GUID
任何人都有任何想法。
提前致谢
答案 0 :(得分:3)
这似乎是Oracle驱动程序或ev的问题。 EF如何通过Guid参数。当你比较两个Guids(一个来自Oracle DB的原始(16),一个Guid在你的程序中)时出现问题。当您的实体将raw(16)作为主键时,它也会出现在Find()操作中。
浪费了几个小时后,我发现了以下临时解决方法: 创建一个Guid列表,添加您要搜索的Guid,然后使用list.Contains()进行比较。看起来好像在这种特殊情况下,比较不是在Oracle数据库服务器上的条件下完成的,而是在.Net程序中。至少它给出了预期的结果。
e.g。
List<Guid> searchList = new List<Guid>();
searchList.Add(anotherGuid);
Context.Users.where(x => searchList.Contains(x.GuidField) );
答案 1 :(得分:1)
来自Oracle .NET团队(通过twitter @oracleDotNet)回应我要求他们看一下线程:这听起来像bug 18336370,这在下一个ODAC版本中得到修复。这里描述的原始bug:community.oracle.com/thread/3523194
答案 2 :(得分:0)
我使用Oracle.ManagedDataAcess.dll版本4.121.1.0遇到了同样的问题。如上所述,我找不到更好的解决方法。非常讨厌的问题,因为GUID到处都是EF。
我目前正在下载ODTwithODAC121012.zip以检查问题是否仍然存在。希望能得到积极的消息。
更新27.1.2015: 我刚刚从Dezember 2014查看了最新版本= 4.121.2.0 Release 3.该软件包是通过nuget console下载的。我仍然使用EF 5代替EF6进行测试。 现在可以使用带有EQUAL(=)的LINQ表达式和针对Oracle数据库的GUID(测试Oracle 11 DB)。 也可以使用基于GUID的外键延迟加载。