|
EF. Как получить ID вставленной записи (для лога) если транзакцию рано завершать ?
|
|||
---|---|---|---|
#18+
Учимся работать с EF и в 99% случаев вообще забываем про транзакции. SQL Код: sql 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. 23. 24. 25. 26. 27. 28. 29. 30. 31. 32. 33. 34. 35. 36. 37. 38. 39. 40. 41. 42.
Код: c# 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. 23. 24.
LogOpened connection at 24.11.2016 15:58:54 +03:00 Started transaction at 24.11.2016 15:58:54 +03:00 INSERT [dbo].[Templates]([Name]) VALUES (@0) SELECT [TemplateId] FROM [dbo].[Templates] WHERE @@ROWCOUNT > 0 AND [TemplateId] = scope_identity() -- @0: 'test' (Type = String, Size = 50) -- Executing at 24.11.2016 15:58:54 +03:00 -- Completed in 0 ms with result: SqlDataReader INSERT [dbo].[Questions]([ParentId], [Name], [TemplateId]) VALUES (NULL, @0, @1) SELECT [QuestionId] FROM [dbo].[Questions] WHERE @@ROWCOUNT > 0 AND [QuestionId] = scope_identity() -- @0: 'test' (Type = String, Size = 50) -- @1: '1008' (Type = Int32) -- Executing at 24.11.2016 15:58:54 +03:00 -- Failed in 54 ms with error: The INSERT statement conflicted with the CHECK constraint "CK_Questions". The conflict occurred in database "Test", table "dbo.Questions", column 'Name'. The statement has been terminated. Closed connection at 24.11.2016 15:58:54 +03:00 ... |
|||
:
Нравится:
Не нравится:
|
|||
24.11.2016, 16:01 |
|
EF. Как получить ID вставленной записи (для лога) если транзакцию рано завершать ?
|
|||
---|---|---|---|
#18+
Смузи, ctx.Database.Log просто выводит всю кучу отправленных SQL запросов насколько я знаю. Каким образом мне из этой кучи гхм... вычерпнуть ID вставленного юзера ? ... |
|||
:
Нравится:
Не нравится:
|
|||
24.11.2016, 16:31 |
|
EF. Как получить ID вставленной записи (для лога) если транзакцию рано завершать ?
|
|||
---|---|---|---|
#18+
Fungus, ctx.Database.Log нужен для того, чтобы показать про неявную транзакцию в батче, это не логгер :)) ... |
|||
:
Нравится:
Не нравится:
|
|||
24.11.2016, 16:38 |
|
EF. Как получить ID вставленной записи (для лога) если транзакцию рано завершать ?
|
|||
---|---|---|---|
#18+
skyANA, Нууууу ок. Делать после каждой вставки юзера SaveChanges чтобы получить его ID мне кажется слишком уж, но раз другого пути нет.... Я опасаюсь, того, что эта операция достаточно дорогостоящая. EF смотрит change tracking, вычисляет изменилось ли что-то и т.д. ... |
|||
:
Нравится:
Не нравится:
|
|||
24.11.2016, 16:41 |
|
EF. Как получить ID вставленной записи (для лога) если транзакцию рано завершать ?
|
|||
---|---|---|---|
#18+
... |
|||
:
Нравится:
Не нравится:
|
|||
24.11.2016, 16:45 |
|
EF. Как получить ID вставленной записи (для лога) если транзакцию рано завершать ?
|
|||
---|---|---|---|
#18+
FungusСмузи, Зачем тогда предлагать этот вариант, если я описал что ищу тут 19930073 и тут 19930369 . Какой вариант? Тебе тылдычат, что не нужно никаких транзакций, EF всё сам сделает. Пример это демонстрирует. А по поводу логирования ошибок тебя послали изучать популярные логгеры. ... |
|||
:
Нравится:
Не нравится:
|
|||
24.11.2016, 16:54 |
|
EF. Как получить ID вставленной записи (для лога) если транзакцию рано завершать ?
|
|||
---|---|---|---|
#18+
FungusskyANA, Нууууу ок. Делать после каждой вставки юзера SaveChanges чтобы получить его ID Это клиника... ... |
|||
:
Нравится:
Не нравится:
|
|||
24.11.2016, 16:55 |
|
EF. Как получить ID вставленной записи (для лога) если транзакцию рано завершать ?
|
|||
---|---|---|---|
#18+
Смузи, А где я говорил про логгирование ошибок, можете показать в том коде где я описывал то, что мне нужно ? Человек видит то, что он хочет видеть. Вы захотели увидеть про логгирование ошибок ? :) Я говорил про логгирование ID сущностей, создаваемых в БД. ... |
|||
:
Нравится:
Не нравится:
|
|||
24.11.2016, 17:00 |
|
EF. Как получить ID вставленной записи (для лога) если транзакцию рано завершать ?
|
|||
---|---|---|---|
#18+
СмузиFungusskyANA, Нууууу ок. Делать после каждой вставки юзера SaveChanges чтобы получить его ID Это клиника... Вы продолжаете искать "логгирование ошибок" в моих сообщениях, и смотрите на окружающий мир сквозь эту призму. ... |
|||
:
Нравится:
Не нравится:
|
|||
24.11.2016, 17:01 |
|
EF. Как получить ID вставленной записи (для лога) если транзакцию рано завершать ?
|
|||
---|---|---|---|
#18+
FungusСмузи, А где я говорил про логгирование ошибок, можете показать в том коде где я описывал то, что мне нужно ? Человек видит то, что он хочет видеть. Вы захотели увидеть про логгирование ошибок ? :) Я говорил про логгирование ID сущностей, создаваемых в БД. Какая принципиальная разница, что логировать? FungusВы продолжаете искать "логгирование ошибок" в моих сообщениях, и смотрите на окружающий мир сквозь эту призму. См. выше. P.S. По существу все ответы были даны. Учить EF и логгеры. Что-то еще? ... |
|||
:
Нравится:
Не нравится:
|
|||
24.11.2016, 17:28 |
|
EF. Как получить ID вставленной записи (для лога) если транзакцию рано завершать ?
|
|||
---|---|---|---|
#18+
Fungus, зачастую логируют то, что Вам надо вообще не в ту же базу, где пользователь создаётся. Или вообще не в базу. Завтра Вы откроете для себя (или тот, кто будет анализировать залогированные данные) Elasticsearch и красивые графики в Kibana и что будете делать? ... |
|||
:
Нравится:
Не нравится:
|
|||
24.11.2016, 17:34 |
|
EF. Как получить ID вставленной записи (для лога) если транзакцию рано завершать ?
|
|||
---|---|---|---|
#18+
Смузи, Разница есть. Но уже не важно. skyANA ответ дал, хоть он мне и не нравится, но хотя бы рабочий. ... |
|||
:
Нравится:
Не нравится:
|
|||
24.11.2016, 17:34 |
|
EF. Как получить ID вставленной записи (для лога) если транзакцию рано завершать ?
|
|||
---|---|---|---|
#18+
Или к примеру на каждой машине логгер пишет в свой файлик, в фоне эти файлики обрабатываются и складываются в одно место. ... |
|||
:
Нравится:
Не нравится:
|
|||
24.11.2016, 17:37 |
|
EF. Как получить ID вставленной записи (для лога) если транзакцию рано завершать ?
|
|||
---|---|---|---|
#18+
FungusСмузи, Разница есть. Какая? FungusskyANA ответ дал, хоть он мне и не нравится, но хотя бы рабочий. Ты даже не понял пример, демонстрирующий работу EF с транзакциями. Что тебе опять не нравится-то? ... |
|||
:
Нравится:
Не нравится:
|
|||
24.11.2016, 17:39 |
|
EF. Как получить ID вставленной записи (для лога) если транзакцию рано завершать ?
|
|||
---|---|---|---|
#18+
Смузи, Разница в том, что логгирование ошибки это такой алгоритм: Код: c# 1. 2. 3. 4. 5. 6. 7. 8. 9.
а мне нужно это (по мотивам от skyANA ) Код: c# 1. 2. 3. 4. 5. 6. 7.
Мне нужно НЕ выполнить транзакцию и узнать были ли проблемы, Код: c# 1.
в процессе выполнения транзакции выяснить ID созданных сущностей (Юзер, Роль) и уже с ними делать что хочу ( например залогировать сразу, или например вставить в некий список, чтобы залогировать отдельно). Ой. Ладно. Можно закрывать вопрос, ответ я получил. ... |
|||
:
Нравится:
Не нравится:
|
|||
24.11.2016, 17:46 |
|
EF. Как получить ID вставленной записи (для лога) если транзакцию рано завершать ?
|
|||
---|---|---|---|
#18+
Fungus, в чём проблема создать сначала Юзера, Роли, закоммитить, а потом уже логировать? ... |
|||
:
Нравится:
Не нравится:
|
|||
24.11.2016, 17:55 |
|
EF. Как получить ID вставленной записи (для лога) если транзакцию рано завершать ?
|
|||
---|---|---|---|
#18+
FungusМне нужно НЕ выполнить транзакцию и узнать были ли проблемы Чтобы узнать, были ли проблемы, нужно обработать исключение. Поэтому без catch вообще никак. Fungusв процессе выполнения транзакции выяснить ID созданных сущностей (Юзер, Роль) Зачем выяснять ID сущностей, если они еще физически не добавлены в БД (и могут быть вообще не добавлены)? Fungus например залогировать сразу, или например вставить в некий список, чтобы залогировать отдельно). Еще раз, какой ID ты собираешься логировать, если его еще нет физически? P.S. Весь этот бред малоинтересен, всё это от незнания как EF, так и архитектуры логирования. Поэтому в десятый раз рекомендую изучить EF и логгеры с их возможностями. ... |
|||
:
Нравится:
Не нравится:
|
|||
24.11.2016, 17:55 |
|
EF. Как получить ID вставленной записи (для лога) если транзакцию рано завершать ?
|
|||
---|---|---|---|
#18+
Fungus например залогировать сразуРискуете поймать дедлок судя по тому, что хотите логировать идентификатор пользователя до коммита транзакции :) ... |
|||
:
Нравится:
Не нравится:
|
|||
24.11.2016, 17:58 |
|
EF. Как получить ID вставленной записи (для лога) если транзакцию рано завершать ?
|
|||
---|---|---|---|
#18+
skyANAFungus, в чём проблема создать сначала Юзера, Роли, закоммитить, а потом уже логировать? В сложности кода. Вот есть у нас такой простой AdoNet код: Код: c# 1. 2.
Вы предлагаете его размазать в разные места программы. В одном месте вставлять юзера, а когда-то потом, где-то после чекина начинать вычислять какие там ID нагенерились, и логировать их. Как вы себе это представляете вообще. Это наверное похоже на сложности программирование через Task.ContinueWith пожалуй. Когда в ContinueWith нам нужно выяснить что там было в начале передано первой задаче вообще. ... |
|||
:
Нравится:
Не нравится:
|
|||
24.11.2016, 17:59 |
|
EF. Как получить ID вставленной записи (для лога) если транзакцию рано завершать ?
|
|||
---|---|---|---|
#18+
FungusskyANAFungus, в чём проблема создать сначала Юзера, Роли, закоммитить, а потом уже логировать? В сложности кода. Упрощай. FungusВот есть у нас такой простой AdoNet код: Код: c# 1. 2.
Вы предлагаете его размазать в разные места программы. Мы предлагаем выкинуть этот код на помойку и написать новый, правильный. ... |
|||
:
Нравится:
Не нравится:
|
|||
24.11.2016, 18:01 |
|
EF. Как получить ID вставленной записи (для лога) если транзакцию рано завершать ?
|
|||
---|---|---|---|
#18+
FungusskyANAFungus, в чём проблема создать сначала Юзера, Роли, закоммитить, а потом уже логировать? В сложности кода. Вот есть у нас такой простой AdoNet код: Код: c# 1. 2.
Вы предлагаете его размазать в разные места программы. В одном месте вставлять юзера, а когда-то потом, где-то после чекина начинать вычислять какие там ID нагенерились, и логировать их. Как вы себе это представляете вообще. Это наверное похоже на сложности программирование через Task.ContinueWith пожалуй. Когда в ContinueWith нам нужно выяснить что там было в начале передано первой задаче вообще. Я ничего не предлагаю. Я у Вас спрашиваю, в чём у Вас сложности :) ... |
|||
:
Нравится:
Не нравится:
|
|||
24.11.2016, 18:02 |
|
EF. Как получить ID вставленной записи (для лога) если транзакцию рано завершать ?
|
|||
---|---|---|---|
#18+
Вот где тут 19930073 что-то размажется, если вынести логирование за пределы транзакции? ... |
|||
:
Нравится:
Не нравится:
|
|||
24.11.2016, 18:03 |
|
EF. Как получить ID вставленной записи (для лога) если транзакцию рано завершать ?
|
|||
---|---|---|---|
#18+
skyANA, Размажется. ладно я понял, что все не просто. Буду думать. Направление вы дали. ... |
|||
:
Нравится:
Не нравится:
|
|||
24.11.2016, 18:06 |
|
EF. Как получить ID вставленной записи (для лога) если транзакцию рано завершать ?
|
|||
---|---|---|---|
#18+
Да и на мой взгляд код должен быть другим: Код: c# 1. 2. 3. 4. 5. 6.
... |
|||
:
Нравится:
Не нравится:
|
|||
24.11.2016, 18:11 |
|
EF. Как получить ID вставленной записи (для лога) если транзакцию рано завершать ?
|
|||
---|---|---|---|
#18+
skyANA, В принципе это именно то, что мне и нужно.Похоже я ошибся разбив добавление Юзера и Ролей на отдельный функционал. Ввиду чего и возникла проблема "собрать все вместе по итогу". Поэтому и пришлось делать логирование непосредственно после вставки каждой сущности.Пожалуй ваше решение это прекрасный пример того, как нужно сделать правильно: выделить задачу как одну функцию, и в ее конце, имея на руках готовый итоговый результат, его и логировать. Мне нужно переосмыслить свой подход. Спасибо за помощь. Похоже я так и не нашел пока нормальный пример правильно построенного приложения с правильным разделением на слои и архитектурой. Где все эти вещи уже есть. Оттого и страдаю фигней, пытаясь их придумать самостоятельно. ... |
|||
:
Нравится:
Не нравится:
|
|||
24.11.2016, 18:22 |
|
|
start [/forum/topic.php?fid=20&msg=39353980&tid=1400196]: |
0ms |
get settings: |
11ms |
get forum list: |
14ms |
check forum access: |
4ms |
check topic access: |
4ms |
track hit: |
55ms |
get topic data: |
11ms |
get forum data: |
3ms |
get page messages: |
55ms |
get tp. blocked users: |
2ms |
others: | 270ms |
total: | 429ms |
0 / 0 |