实体框架和Oracle无法查询GUID字段

本文关键字:查询 GUID 字段 框架 Oracle 实体 | 更新日期: 2023-09-27 18:03:38

我有最新版本的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

有人有什么想法吗?

Thanks in advance

实体框架和Oracle无法查询GUID字段

这似乎是Oracle驱动程序或ev的问题。EF如何传递Guid参数。当您比较两个Guid(一个来自Oracle DB的原始Guid(16),一个在您的程序中的Guid)时,会出现这个问题。当你的实体有一个raw(16)作为主键时,它也会出现在Find()操作中。

在浪费了几个小时的时间后,我找到了以下临时解决方案:创建一个Guid列表,添加您正在搜索的Guid,然后使用list. contains()进行比较。似乎在这种特殊情况下,比较不是在数据库服务器上的Oracle where条件中进行的,而是在您的。net程序中进行的。至少它给出了预期的结果。

List<Guid> searchList = new List<Guid>();
searchList.Add(anotherGuid);
Context.Users.where(x => searchList.Contains(x.GuidField) );

来自Oracle . net团队(通过twitter @oracleDotNet)回应我要求他们看看这个线程:这听起来像错误18336370,在下一个ODAC版本中修复。这里描述的原始错误:community.oracle.com/thread/3523194

我在使用oracle . manageddataaccess .dll版本4.121.1.0时遇到了同样的问题。如上所述,我找不到更好的解决方法。非常恼人的问题,因为guid到处都是EF格式的。

我目前正在下载ODTwithODAC121012.zip以检查问题是否仍然存在。希望能带来好消息。

更新27.1.2015:我刚刚检查了2014年12月的最新版本=4.121.2.0 Release 3。包是通过nuget控制台下载的。我仍然使用EF 5而不是EF6进行测试。现在可以对Oracle数据库(Test Oracle 11db)使用带有EQUAL(=)和GUID的LINQ表达式。也可以使用基于guid的外键延迟加载。