我有一个类似以下的模型
[Table("SERVICE_REFERENCE", Schema = "SCHEMAOWNER")]
public class ServiceReferenceModel
{
[Key]
[Column("SERVICE_ID", TypeName="Guid")]
public Guid ServiceID { get; set; }
[Column("SERVICE_NAME")]
public string ServiceName { get; set; }
}
基于如下所示的Oracle数据库中的表
CREATE TABLE "SCHEMAOWNER"."SERVICE_REFERENCE" (
"SERVICE_ID" RAW(16) DEFAULT SYS_GUID() NOT NULL ENABLE,
"SERVICE_NAME" VARCHAR2(30 BYTE) NOT NULL ENABLE,
CONSTRAINT "SERVICE_REFERENCE_PK" PRIMARY KEY ("SERVICE_ID")
...
)
对于执行基本查询,通过Entity Framework使用基于LINQ的直接查询就可以了。但是,我有一个视图模型,该视图模型使用来自ServiceReferenceModel
的属性,该属性使用原始SQL查询,因为基于LINQ的查询存在局限性。
为了进行这些原始查询,我遵循了question的第一个答案的建议,并制作了Oracle的EntityFrameworkExtensions类。
对于大多数查询来说,这都可以正常工作,但是任何与Guid类型相关的问题,我都会遇到强制转换错误
从实例化的“ System.Byte []”类型到“ System.Guid”类型的指定强制转换无效。
,捕获的代码在ObjectContext.Translate
行:
using (var result = ((IObjectContextAdapter)db).ObjectContext.Translate<T>(reader))
我了解发生了什么事。 Translate方法无法将我的原始数据从Oracle(因为Oracle没有GUID类型)转换为.NET GUID类型。如果我将字段转换为byte[]
类型,然后运行它,它就可以正常工作,但是当我进行更改时,这会影响到写回数据库的工作。
在进入Translate函数之前,有什么方法可以截获数据并手动对GUID操作执行任何byte []吗?