2013-06-04 1 views
0

Я использую devart dotconnect для Oracle v7.7 и получаю непредвиденную ошибку. Я вставляю запись в таблицу A, а затем еще несколько записей в таблицу B, где B имеет внешний ключ для A, и я получаю ошибку родительского ключа, не найденную.Devart dotconnect - Есть ли способ заставить команду фиксации?

SsinpatDataContext dc = new SsinpatDataContext(); 
Document doc = new Document(); 
doc.Text = "bla bla bla"; 
var id = dc.ExecuteQuery<decimal>("SELECT DOCUMENT_SEQ.NEXTVAL FROM DUAL"); 
doc.Id = id.ElementAt(0); 
dc.Documents.InsertOnSubmit(doc); 

DocumentRows dr = new DocumentRows(); 
dr.Text = "bla bla bla"; 
dr.DocId = doc.Id; 
dc.DocumentRows.InsertOnSubmit(dr); 

dc.SubmitChanges(); 

это бросает исключение с текстом «ORA-02291: ограничение целостности нарушаться-родительский ключ не найден» Мне кажется, что Devart пытается совершить DocumentRows объект первым, и только тогда объект Document ...

Теперь, мой вопрос заключается в том, есть ли способ заставить принудительный заказ выполнить.

Спасибо.

ответ

0

Возможно, проблема заключается в том, что для IdGenerator установлено значение Sequence для свойства Id документа класса сущности в вашей модели. И, в связи с тем, что вы выполняете этот запрос в коде

"SELECT DOCUMENT_SEQ.NEXTVAL FROM DUAL" 

следующее значение последовательности опрашивается дважды и расхождение последнее значение последовательности происходит. Вы можете проверить это с помощью протоколирования:

SsinpatDataContext dc = new SsinpatDataContext(){Log=Console.Out}; 

Чтобы избежать этой ошибки в вашем сценарии, вы должны установить IdGenerator в None для свойства Идентификатор класса Document объекта и повторно генерировать код для вашей модели.

Однако, тем лучше сценарий будет следующим:

1) установить IdGenerator в последовательности для свойства Id класса сущностей документа; укажите имя последовательности, в вашем случае - DOCUMENT_SEQ;

2) переписывают вам код:

SsinpatDataContext dc = new SsinpatDataContext(){Log=Console.Out}; 
Document doc = new Document(); 
doc.Text = "bla bla bla"; 
DocumentRows dr = new DocumentRows(); 
dr.Text = "bla bla bla"; 
dr.Doc = doc; 
dc.Documents.InsertOnSubmit(doc); 
dc.SubmitChanges(); 
+0

Спасибо за ваш ответ. Однако у меня нет набора IdGenerator. Это работало отлично, прежде чем мы обновили его с v6.3 до 7.7. Я буду следовать вашему намеку на регистрацию, чтобы лучше понять, что происходит. –