powered by simpleCommunicator - 2.0.53     © 2025 Programmizd 02
Форумы / WinForms, .Net Framework [игнор отключен] [закрыт для гостей] / EF. Как получить ID вставленной записи (для лога) если транзакцию рано завершать ?
25 сообщений из 57, страница 1 из 3
EF. Как получить ID вставленной записи (для лога) если транзакцию рано завершать ?
    #39353679
Fungus
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Как организовывать логгирование вставленных записей, в условиях когда записи вставляются в рамках большой транзакции, и рано ее комитить ?
Если создается юзер, и нужно бы в логер отправить информацию с новым ID. А после создания юзера будем еще что-то создавать - роли ему или еще что-то, уже в следующих методах.
...
Рейтинг: 0 / 0
EF. Как получить ID вставленной записи (для лога) если транзакцию рано завершать ?
    #39353692
Fungus
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Предположим в чистом Ado.Net код будет таким:

Код: c#
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
// где то стартуем транзакцию.
using (var transactionScope = new TransactionScope(TransactionScopeOption.Requires , new TransactionOptions() { IsolationLevel = IsolationLevel.Serializable })
{  
   var userId = _userRepo.CreateUser();
   _logger.LogInfo(userId.ToSintrg());

   .... _rolesRepo.SetRoles(userId,....);
   _logger.LogInfo....

   transactionScope.Complete();
}


Да нужно минимизировать длительность транзакции и т.д. Но в итоге залогируем все, что нам нужно.
...
Рейтинг: 0 / 0
EF. Как получить ID вставленной записи (для лога) если транзакцию рано завершать ?
    #39353699
Фотография skyANA
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Fungus, Вы ещё отправку уведомления по почте внутрь транзакции добавьте :)
...
Рейтинг: 0 / 0
EF. Как получить ID вставленной записи (для лога) если транзакцию рано завершать ?
    #39353706
Fungus
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
skyANA,

Логгирование не нужно ? Или в триггеры пихать, размазывая логику.
...
Рейтинг: 0 / 0
EF. Как получить ID вставленной записи (для лога) если транзакцию рано завершать ?
    #39353721
Фотография skyANA
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Fungus, нужно, но зачем его внутрь транзакции засовывать?
...
Рейтинг: 0 / 0
EF. Как получить ID вставленной записи (для лога) если транзакцию рано завершать ?
    #39353729
Fungus
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
skyANA,

а, вы про то, что логгирование происходит в этой же транзакции ?
В принципе да, это можно вынести в отдельную автономную транзакцию, и комитить ее отдельно. Если рабочая транзакция отвалится по ошибке, то транзакция логирования должна будет закомитится более менее гарантировано.

Но это все детали. Основной вопрос, как делать логгирование в EF.
...
Рейтинг: 0 / 0
EF. Как получить ID вставленной записи (для лога) если транзакцию рано завершать ?
    #39353732
Фотография Смузи
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
FungusКак получить ID вставленной записи (для лога) если транзакцию рано завершать
Добавить колонку CorrelationId (GUID) и прозрачно с ней работать в логике.
...
Рейтинг: 0 / 0
EF. Как получить ID вставленной записи (для лога) если транзакцию рано завершать ?
    #39353739
Fungus
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Смузи,

Можно подробней пожалуйста ? не понял.
...
Рейтинг: 0 / 0
EF. Как получить ID вставленной записи (для лога) если транзакцию рано завершать ?
    #39353743
Фотография skyANA
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
FungusskyANA,

а, вы про то, что логгирование происходит в этой же транзакции ?
В принципе да, это можно вынести в отдельную автономную транзакцию, и комитить ее отдельно. Если рабочая транзакция отвалится по ошибке, то транзакция логирования должна будет закомитится более менее гарантировано.

Но это все детали. Основной вопрос, как делать логгирование в EF.
А зачем делать логгирование в EF? Берёте log4net, NLog, или Serilog, или EnterpriseLibrary.Logging и используете.
...
Рейтинг: 0 / 0
EF. Как получить ID вставленной записи (для лога) если транзакцию рано завершать ?
    #39353745
Фотография Смузи
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Типичная ошибка в SharePoint. Несколько логов могут проходить по одному коррелейшену.

...
Рейтинг: 0 / 0
EF. Как получить ID вставленной записи (для лога) если транзакцию рано завершать ?
    #39353751
Фотография Смузи
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
И потом всегда можно вытащить события

...
Рейтинг: 0 / 0
EF. Как получить ID вставленной записи (для лога) если транзакцию рано завершать ?
    #39353754
Fungus
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
skyANA,

Суть вопроса в том, что получить Id вставленной записи мы можем непосредственно вставив сущность в БД, и считав ее через SCOPE_IDENTITY(). Но EF же не вставит пока не вызовем SaveChanges, который произойдет гораздо позже. И как получить ID вставленной записи в том месте, где код создает ее (чтобы тут же вставить в лог) ? Или как вообще реализовать логгирование всех создаваемых сущностей.
...
Рейтинг: 0 / 0
EF. Как получить ID вставленной записи (для лога) если транзакцию рано завершать ?
    #39353756
Фотография skyANA
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Fungus, а в чём проблема вызвать SaveChanges?
...
Рейтинг: 0 / 0
EF. Как получить ID вставленной записи (для лога) если транзакцию рано завершать ?
    #39353759
Fungus
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Смузи,

Что вообще за ID корелляции, и как он относится к логгированию в программе ? Правильно ли я понимаю, что вы предлагаете создавать псевдо ключ в виде GUID. А потом, после SaveChanges, собирать по базе все вставленные сущности имея на руках эти псевдо ключи и вычисляя реальный id ?
И это все вместо этих строчек кода:
Код: c#
1.
2.
var userId = _userRepo.CreateUser(); // вставка в БД и одновременное получение SCOPE_IDENTITY()
_logger.LogInfo(userId.ToSintrg());
...
Рейтинг: 0 / 0
EF. Как получить ID вставленной записи (для лога) если транзакцию рано завершать ?
    #39353762
Фотография Смузи
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Что за логгер? К примеру в энлоге:

http://nlog-project.org/2015/08/31/nlog-4-1-0-is-now-available.html Trace Activity Id Layout Renderer: ${activityid} write the System.Diagnostics his trace correlation id.
...
Рейтинг: 0 / 0
EF. Как получить ID вставленной записи (для лога) если транзакцию рано завершать ?
    #39353765
Fungus
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
skyANAFungus, а в чём проблема вызвать SaveChanges?
SaveChanges это же комит транзакции. Если мы вставим Юзера, сделаем SaveChanges, а при вставке ролей упадем по ошибке, то как откатывать вставленного юзера ?
...
Рейтинг: 0 / 0
EF. Как получить ID вставленной записи (для лога) если транзакцию рано завершать ?
    #39353767
Фотография Смузи
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
FungusПравильно ли я понимаю, что вы предлагаете создавать псевдо ключ в виде GUID. А потом, после SaveChanges, собирать по базе все вставленные сущности имея на руках эти псевдо ключи и вычисляя реальный id ?
Да, это ключ логгера.
...
Рейтинг: 0 / 0
EF. Как получить ID вставленной записи (для лога) если транзакцию рано завершать ?
    #39353770
Fungus
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Смузи,

19930284 ?
...
Рейтинг: 0 / 0
EF. Как получить ID вставленной записи (для лога) если транзакцию рано завершать ?
    #39353771
Фотография Смузи
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
FungusskyANAFungus, а в чём проблема вызвать SaveChanges?
SaveChanges это же комит транзакции. Если мы вставим Юзера, сделаем SaveChanges, а при вставке ролей упадем по ошибке, то как откатывать вставленного юзера ?
Еще раз, какая задача решается, транзакции или логирование? Это две перпендикулярные плоскости.
...
Рейтинг: 0 / 0
EF. Как получить ID вставленной записи (для лога) если транзакцию рано завершать ?
    #39353775
Фотография Смузи
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
FungusЕсли мы вставим Юзера, сделаем SaveChanges, а при вставке ролей упадем по ошибке, то как откатывать вставленного юзера ?
Так это нужно делать одним SaveChanges. Транзакция у EF будет, но она будет неявная.
...
Рейтинг: 0 / 0
EF. Как получить ID вставленной записи (для лога) если транзакцию рано завершать ?
    #39353779
Fungus
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
СмузиFungusПравильно ли я понимаю, что вы предлагаете создавать псевдо ключ в виде GUID. А потом, после SaveChanges, собирать по базе все вставленные сущности имея на руках эти псевдо ключи и вычисляя реальный id ?
Да, это ключ логгера.

вы серьезно ? Предлагаете реализовать такой велосипед:

Код: c#
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
List<Guid> insertedUsers; // некий глобальный список

using (var transactionScope = new TransactionScope(TransactionScopeOption.Requires , new TransactionOptions() { IsolationLevel = IsolationLevel.Serializable })
{ 
   var corellationId = Guid.new();
   var user = new  User (corellationId);
   _userRepo.CreateUser(user);
   insertedUsers.Add(corellationId);

   transactionScope.Complete();
}

// Вычисление Id вставленных corellationId и вставка записей логгера ?



По моему это какая то глупость.
...
Рейтинг: 0 / 0
EF. Как получить ID вставленной записи (для лога) если транзакцию рано завершать ?
    #39353783
Фотография Смузи
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
FungusПо моему это какая то глупость.
Correlation - это атрибут логгера, а не User. Я же написал выше. Во-вторых, зачем тут TransactionScope? Еще раз, в контекст добавляй юзера, прикручивай к нему роли и сохраняйся. Пора бы уже выучить EF.
...
Рейтинг: 0 / 0
EF. Как получить ID вставленной записи (для лога) если транзакцию рано завершать ?
    #39353784
Fungus
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
СмузиЕще раз, какая задача решается, транзакции или логирование?

Задача, реализовать на EF такой код

Код: c#
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
// где то стартуем транзакцию.
using (var transactionScope = new TransactionScope(TransactionScopeOption.Requires , new TransactionOptions() { IsolationLevel = IsolationLevel.Serializable })
{  
   var userId = _userRepo.CreateUser();
   _logger.LogInfo(userId.ToSintrg());    << Эта строчка получает ID записи, дальше можем логировать как хотим.

   .... _rolesRepo.SetRoles(userId,....);
   _logger.LogInfo....

   transactionScope.Complete();
}



так, чтобы в итоге в логе оказались ID юзера и назначенных ему записей в таблице UserRoles.
...
Рейтинг: 0 / 0
EF. Как получить ID вставленной записи (для лога) если транзакцию рано завершать ?
    #39353789
Фотография Смузи
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Я выше написал что делать. Учить EF и выбрать готовый логгер, как советовал skyANA. Больше нечего добавить.
...
Рейтинг: 0 / 0
EF. Как получить ID вставленной записи (для лога) если транзакцию рано завершать ?
    #39353813
Фотография skyANA
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
FungusskyANAFungus, а в чём проблема вызвать SaveChanges?
SaveChanges это же комит транзакции. Если мы вставим Юзера, сделаем SaveChanges, а при вставке ролей упадем по ошибке, то как откатывать вставленного юзера ?
Нормально откатится.

http://stackoverflow.com/questions/17523568/entity-framework-retrieve-id-before-savechanges-inside-a-transaction
...
Рейтинг: 0 / 0
25 сообщений из 57, страница 1 из 3
Форумы / WinForms, .Net Framework [игнор отключен] [закрыт для гостей] / EF. Как получить ID вставленной записи (для лога) если транзакцию рано завершать ?
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]