Как да осигуря вмъкване на идемпотентна база данни с Entity Framework 5?

Искам да се уверя, че актуализациите на моята база данни (SQL Server) са идемпотентни, подобни по функционалност на публикацията в блога по-долу, но използвайки Entity Framework (v5, Database First):

http://blogs.msdn.com/b/adonet/archive/2013/03/11/sql-database-connectivity-and-the-idempotency-issue.aspx

Въпреки това, ако добавя параметър @Operation към моята процедура за вмъкване, получавам

"Грешка 2037: Обвързване на функция за съпоставяне указва функция... но не съпоставя следните параметри на функцията: Операция"

(@Operation ще бъде GUID, генериран от приложението, позволяващ на приложението да опита отново със същия GUID, ако не получи успешен отговор от proc. Proc ще запише GUID в журнална таблица и ще изпълни само вмъкнете, ако GUID не съществува - като по този начин се гарантира идемпотентна транзакция.)

Има ли елегантно решение?


person Steve S    schedule 16.03.2013    source източник
comment
Как картографирате този параметър?   -  person Ladislav Mrnka    schedule 17.03.2013
comment
Използвам подход Database First (редактирах въпроса, за да изясня); в прозореца за съпоставяне на proc на редактора на модела не мога да редактирам съпоставянето на свойството @Operation. Така че отговорът на вашия коментар е, че не съм (оттук и грешката!).   -  person Steve S    schedule 17.03.2013
comment
Съпоставихте ли съхранената процедура с операция за вмъкване на обекта? В такъв случай вашият обект трябва да има Operation свойство.   -  person Ladislav Mrnka    schedule 17.03.2013
comment
Да, но обектът няма колона за операции - параметърът е допълнителен. Той е там само за да позволи на съхранената процедура да гарантира, че вмъкването е идемпотентно. Възможно ли е съхранена процедура да бъде картографирана като операция за вмъкване с повече колони от основния обект?   -  person Steve S    schedule 17.03.2013
comment
Не, не е възможно.   -  person Ladislav Mrnka    schedule 17.03.2013
comment
Можете ли да добавите повече подробности защо не можете да използвате вместо това MERGE, което няма да направи нищо при съвпадение (Т.Е. не се използва клаузата WHEN MATCHED)   -  person Matt Kerr    schedule 11.06.2013


Отговори (2)


Версия 6.1 на Entity Framework ще реши този проблем. (Благодаря на екипа на EF - невероятна работа.)

https://entityframework.codeplex.com/wikipage?title=Handling%20of%20Transaction%20Commit%20Failures%20

person Steve S    schedule 19.02.2014

Ако разбрах вашата заявка правилно - Какво ще кажете за прилагане на уникално ограничение върху колоната, която съдържа GUID и след това, ако не получите успешен отговор след ИЗПЪЛНЕНИЕ на процедурата, опитайте отново вмъкването.

В рамките на процедурата за вмъкване потенциално използвайте try/catch или дори заявка за GUID стойността без Try/Catch и ако е там, обработете изключението или просто излезте от процедурата чисто със съобщение за успех чрез израза RETURN.

Не мисля, че ще трябва да правите нещо специално от страна на EF.

И едно последно нещо, може би да обвиете израза за вмъкване/актуализация на CRUD в транзакция, за да сте сигурни, че дадена стойност действително е написана, както в предоставения пример.

person bbqchickenrobot    schedule 13.06.2013