Гость
Форумы / WinForms, .Net Framework [игнор отключен] [закрыт для гостей] / EF. Как получить ID вставленной записи (для лога) если транзакцию рано завершать ? / 25 сообщений из 57, страница 1 из 3
24.11.2016, 14:31
    #39353679
Fungus
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
EF. Как получить ID вставленной записи (для лога) если транзакцию рано завершать ?
Как организовывать логгирование вставленных записей, в условиях когда записи вставляются в рамках большой транзакции, и рано ее комитить ?
Если создается юзер, и нужно бы в логер отправить информацию с новым ID. А после создания юзера будем еще что-то создавать - роли ему или еще что-то, уже в следующих методах.
...
Рейтинг: 0 / 0
24.11.2016, 14:40
    #39353692
Fungus
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
EF. Как получить ID вставленной записи (для лога) если транзакцию рано завершать ?
Предположим в чистом 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
24.11.2016, 14:43
    #39353699
skyANA
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
EF. Как получить ID вставленной записи (для лога) если транзакцию рано завершать ?
Fungus, Вы ещё отправку уведомления по почте внутрь транзакции добавьте :)
...
Рейтинг: 0 / 0
24.11.2016, 14:46
    #39353706
Fungus
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
EF. Как получить ID вставленной записи (для лога) если транзакцию рано завершать ?
skyANA,

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

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

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

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

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

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

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

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

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

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

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
24.11.2016, 15:19
    #39353765
Fungus
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
EF. Как получить ID вставленной записи (для лога) если транзакцию рано завершать ?
skyANAFungus, а в чём проблема вызвать SaveChanges?
SaveChanges это же комит транзакции. Если мы вставим Юзера, сделаем SaveChanges, а при вставке ролей упадем по ошибке, то как откатывать вставленного юзера ?
...
Рейтинг: 0 / 0
24.11.2016, 15:19
    #39353767
Смузи
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
EF. Как получить ID вставленной записи (для лога) если транзакцию рано завершать ?
FungusПравильно ли я понимаю, что вы предлагаете создавать псевдо ключ в виде GUID. А потом, после SaveChanges, собирать по базе все вставленные сущности имея на руках эти псевдо ключи и вычисляя реальный id ?
Да, это ключ логгера.
...
Рейтинг: 0 / 0
24.11.2016, 15:20
    #39353770
Fungus
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
EF. Как получить ID вставленной записи (для лога) если транзакцию рано завершать ?
Смузи,

19930284 ?
...
Рейтинг: 0 / 0
24.11.2016, 15:20
    #39353771
Смузи
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
EF. Как получить ID вставленной записи (для лога) если транзакцию рано завершать ?
FungusskyANAFungus, а в чём проблема вызвать SaveChanges?
SaveChanges это же комит транзакции. Если мы вставим Юзера, сделаем SaveChanges, а при вставке ролей упадем по ошибке, то как откатывать вставленного юзера ?
Еще раз, какая задача решается, транзакции или логирование? Это две перпендикулярные плоскости.
...
Рейтинг: 0 / 0
24.11.2016, 15:23
    #39353775
Смузи
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
EF. Как получить ID вставленной записи (для лога) если транзакцию рано завершать ?
FungusЕсли мы вставим Юзера, сделаем SaveChanges, а при вставке ролей упадем по ошибке, то как откатывать вставленного юзера ?
Так это нужно делать одним SaveChanges. Транзакция у EF будет, но она будет неявная.
...
Рейтинг: 0 / 0
24.11.2016, 15:25
    #39353779
Fungus
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
EF. Как получить ID вставленной записи (для лога) если транзакцию рано завершать ?
Смузи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
24.11.2016, 15:28
    #39353783
Смузи
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
EF. Как получить ID вставленной записи (для лога) если транзакцию рано завершать ?
FungusПо моему это какая то глупость.
Correlation - это атрибут логгера, а не User. Я же написал выше. Во-вторых, зачем тут TransactionScope? Еще раз, в контекст добавляй юзера, прикручивай к нему роли и сохраняйся. Пора бы уже выучить EF.
...
Рейтинг: 0 / 0
24.11.2016, 15:28
    #39353784
Fungus
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
EF. Как получить ID вставленной записи (для лога) если транзакцию рано завершать ?
СмузиЕще раз, какая задача решается, транзакции или логирование?

Задача, реализовать на 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
24.11.2016, 15:32
    #39353789
Смузи
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
EF. Как получить ID вставленной записи (для лога) если транзакцию рано завершать ?
Я выше написал что делать. Учить EF и выбрать готовый логгер, как советовал skyANA. Больше нечего добавить.
...
Рейтинг: 0 / 0
24.11.2016, 15:44
    #39353813
skyANA
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
EF. Как получить ID вставленной записи (для лога) если транзакцию рано завершать ?
FungusskyANAFungus, а в чём проблема вызвать SaveChanges?
SaveChanges это же комит транзакции. Если мы вставим Юзера, сделаем SaveChanges, а при вставке ролей упадем по ошибке, то как откатывать вставленного юзера ?
Нормально откатится.

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


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