Я написал простую тестовую программу, которая будет получать доступ к модели HR по умолчанию на Oracle Express в прямом режиме, используя DevArt dotConnect для Oracle v. 6.8.0.350:
using (var ctx = new HREntities())
{
var locNew = new LOCATION();
locNew.CITY = "Magdeburg";
ctx.LOCATIONs.AddObject(locNew);
ctx.SaveChanges();
// will output 0; in database ID is generated
Console.WriteLine(locNew.LOCATIONID);
}
Как видите, я делаю вставку в таблицу LOCATION
. Здесь я добавил триггер:
create or replace
trigger TRG_LOCATION_INS
before insert on "HR"."LOCATIONS"
for each row
begin
if inserting then
select LOCATIONS_SEQ.nextval into :NEW."LOCATION_ID" from dual;
end if;
end;
Последним шагом была установка StoreGeneratedPattern
в моей модели на Identity
(да, я проверил, записано ли это в XML).
Если я запускаю тестовое приложение, создается запись, и она получает действительный новый LocationID
. Но в EF новый ID не поступит.
Почему он не распознает сгенерированный идентификатор? Если да, что это значит: Блог DevArt
РЕДАКТИРОВАТЬ: сейчас я тестировал его в разных сценариях:
- devArt EntityModel в прямом режиме
- devArt EntityModel с OracleClient
- EntityModel ADO.NET с OracleClient
Результат тот же. DSID
не возвращается в SaveChanged. В качестве другого результата, если я напишу
ctx.Refresh(RefreshMode.ClientWins, log);
InvalidOperationException вызовет сообщение о том, что теперь есть объект с ключом «0», который является правильным, но бесполезным :-(.