2

В моем проекте есть два контекста EF 4.1, один из них является первым для модели, а второй - кодовым. Оба контекста расширяют DbContext и подключаются к базе данных Oracle.EntityFramework 4.1 Code First Oracle Вставка кода PL/SQL

При выполнении обновления для большой таблицы (5M записей), то модель-первых контекст создает SQL, как можно было бы ожидать, и она работает быстро (миллисекунды):

update <schema.table_name> set field = 'value' where id = 1234 

При выполнении обновления на большой стол (4.7M записей), то кода первого контекст производит некоторые PL/SQL, который странный:

declare 
"UWI" nvarchar2(
       128) 
; 
begin 
update 
       "SCHEMA"."TABLE" 
set "FIELD" = 'VALUE' /* :p0 */, 

where ("UWI" = '2224434' /* :p37 */) 

returning 
"UWI" into 
"UWI"; 
open '' /* :p38 */ for select 

"UWI" as "UWI" 
from dual; 
end; 

Это заявление обновления занимает 3 секунды, чтобы закончить.

Вот код-первых EntityTypeConfiguration для контекста кода-первых:

public WellEntityConfiguration() 
{ 
    this.ToTable("TABLE", "SCHEMA"); 

    this.HasKey(entity => entity.Uwi); 
    this.Property(entity => entity.Uwi).HasColumnName("UWI"); 

    ... //lots of properties being set 
} 

Есть ли конфигурация я могу установить, чтобы заставить EF, чтобы создать простое обновление заявление вместо безумного PL/SQL?

ответ

1

Ответ на это в два раза.

Удаление PL/SQL из сгенерированного SQL

Имя столбца в базе данных во всех заглавных букв («UWI»), а свойство на классе верблюжьей случай («UWI») , Я изменил имя свойства для всех колпачков и EF удаляет/код PL SQL и производит только SQL:

UPDATE "SCHEMA"."TABLE" 
SET "FIELD" = "VALUE" 
WHERE ("UWI" = '2224434') 

Однако это не улучшает производительность.

Почему обновление было Slow

После работы с АБД проследить запрос, мы обнаружили, что EF является обязательным ценность UWI для шестнадцатеричной строки вместо «2224434.» Это заставило Oracle делать полное сканирование таблицы и влиять на производительность. Мне нужно указать тип столбца на Uwi собственности, например, так:

this.Property(entity => entity.Uwi).HasColumnName("UWI").HasColumnType("VARCHAR2"); 

HasColumnType был чудодейственным и мое заявление обновление возвращается в 80 миллисекунд.

Смежные вопросы