У меня есть модель, подобная следующей
[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")
...
)
Для выполнения базовых запросов использование прямых запросов на основе LINQ через Entity Framework подходит просто отлично. Тем не менее, у меня есть модель представления, которая использует свойства из ServiceReferenceModel
, которая использует необработанный запрос SQL из-за ограничений запросов на основе LINQ.
Для выполнения этих необработанных запросов я следовал совету из первого ответа на этот вопрос и создал класс EntityFrameworkExtensions для Oracle.
Для большинства запросов это работает нормально, но все, что связано с типами 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 вручную?