Перевести объектную модель из базы данных Oracle - PullRequest
0 голосов
/ 26 октября 2018

У меня есть модель, подобная следующей

[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 вручную?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...