powered by simpleCommunicator - 2.0.53     © 2025 Programmizd 02
Форумы / WinForms, .Net Framework [игнор отключен] [закрыт для гостей] / EF. Как получить ID вставленной записи (для лога) если транзакцию рано завершать ?
57 сообщений из 57, показаны все 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
EF. Как получить ID вставленной записи (для лога) если транзакцию рано завершать ?
    #39353829
Фотография Смузи
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Учимся работать с 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.
CREATE TABLE [dbo].[Templates](
	[TemplateId] [int] IDENTITY(1,1) NOT NULL,
	[Name] [nvarchar](50) NOT NULL,
 CONSTRAINT [PK_Templates] PRIMARY KEY CLUSTERED 
(
	[TemplateId] ASC
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
) ON [PRIMARY]
GO

CREATE TABLE [dbo].[Questions](
	[QuestionId] [int] IDENTITY(1,1) NOT NULL,
	[ParentId] [int] NULL,
	[Name] [nvarchar](50) NOT NULL,
	[TemplateId] [int] NOT NULL,
 CONSTRAINT [PK_Questions] PRIMARY KEY CLUSTERED 
(
	[QuestionId] ASC
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
) ON [PRIMARY]

GO

ALTER TABLE [dbo].[Questions]  WITH CHECK ADD  CONSTRAINT [FK_Questions_Questions] FOREIGN KEY([ParentId])
REFERENCES [dbo].[Questions] ([QuestionId])
GO

ALTER TABLE [dbo].[Questions] CHECK CONSTRAINT [FK_Questions_Questions]
GO

ALTER TABLE [dbo].[Questions]  WITH CHECK ADD  CONSTRAINT [FK_Questions_Templates] FOREIGN KEY([TemplateId])
REFERENCES [dbo].[Templates] ([TemplateId])
GO

ALTER TABLE [dbo].[Questions] CHECK CONSTRAINT [FK_Questions_Templates]
GO

ALTER TABLE [dbo].[Questions]  WITH CHECK ADD  CONSTRAINT [CK_Questions] CHECK  (([Name]<>'test'))
GO

ALTER TABLE [dbo].[Questions] CHECK CONSTRAINT [CK_Questions]
GO



Код: 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.
class Program
{
    static void Main(string[] args)
    {
        try
        {
            var ctx = new Test();

            ctx.Database.Log = Console.WriteLine;

            var template = new Template { Name = "test" };
            template.Questions.Add(new Question { Name = "test" });
            ctx.Templates.Add(template);

            ctx.SaveChanges();
        }
        catch 
        {

        }

        Console.Read();
    }
}



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

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

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

Зачем тогда предлагать этот вариант, если я описал что ищу тут 19930073 и тут 19930369 .
...
Рейтинг: 0 / 0
EF. Как получить ID вставленной записи (для лога) если транзакцию рано завершать ?
    #39353890
Фотография Смузи
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
FungusСмузи, Зачем тогда предлагать этот вариант, если я описал что ищу тут 19930073 и тут 19930369 .
Какой вариант? Тебе тылдычат, что не нужно никаких транзакций, EF всё сам сделает. Пример это демонстрирует. А по поводу логирования ошибок тебя послали изучать популярные логгеры.
...
Рейтинг: 0 / 0
EF. Как получить ID вставленной записи (для лога) если транзакцию рано завершать ?
    #39353891
Фотография Смузи
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
FungusskyANA, Нууууу ок. Делать после каждой вставки юзера SaveChanges чтобы получить его ID
Это клиника...
...
Рейтинг: 0 / 0
EF. Как получить ID вставленной записи (для лога) если транзакцию рано завершать ?
    #39353899
Fungus
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Смузи,

А где я говорил про логгирование ошибок, можете показать в том коде где я описывал то, что мне нужно ? Человек видит то, что он хочет видеть. Вы захотели увидеть про логгирование ошибок ? :) Я говорил про логгирование ID сущностей, создаваемых в БД.
...
Рейтинг: 0 / 0
EF. Как получить ID вставленной записи (для лога) если транзакцию рано завершать ?
    #39353902
Fungus
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
СмузиFungusskyANA, Нууууу ок. Делать после каждой вставки юзера SaveChanges чтобы получить его ID
Это клиника...
Вы продолжаете искать "логгирование ошибок" в моих сообщениях, и смотрите на окружающий мир сквозь эту призму.
...
Рейтинг: 0 / 0
EF. Как получить ID вставленной записи (для лога) если транзакцию рано завершать ?
    #39353936
Фотография Смузи
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
FungusСмузи, А где я говорил про логгирование ошибок, можете показать в том коде где я описывал то, что мне нужно ? Человек видит то, что он хочет видеть. Вы захотели увидеть про логгирование ошибок ? :) Я говорил про логгирование ID сущностей, создаваемых в БД.
Какая принципиальная разница, что логировать?

FungusВы продолжаете искать "логгирование ошибок" в моих сообщениях, и смотрите на окружающий мир сквозь эту призму.
См. выше.

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

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

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

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

Разница в том, что логгирование ошибки это такой алгоритм:
Код: c#
1.
2.
3.
4.
5.
6.
7.
8.
9.
try
{
  .....
  SaveChanges();
}
catch
{
  вот тут и логируем ошибку
}



а мне нужно это (по мотивам от skyANA )

Код: c#
1.
2.
3.
4.
5.
6.
7.
using (TranstactionScope)
  using (DbContext)
  {
     UserInsert(usr)
     SaveChanges(); // Чертов комит ! Но он заполонит Id юзера
     Log(usr.id)
  }



Мне нужно НЕ выполнить транзакцию и узнать были ли проблемы,
Код: c#
1.
А

в процессе выполнения транзакции выяснить ID созданных сущностей (Юзер, Роль) и уже с ними делать что хочу ( например залогировать сразу, или например вставить в некий список, чтобы залогировать отдельно).


Ой. Ладно. Можно закрывать вопрос, ответ я получил.
...
Рейтинг: 0 / 0
EF. Как получить ID вставленной записи (для лога) если транзакцию рано завершать ?
    #39353973
Фотография skyANA
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Fungus, в чём проблема создать сначала Юзера, Роли, закоммитить, а потом уже логировать?
...
Рейтинг: 0 / 0
EF. Как получить ID вставленной записи (для лога) если транзакцию рано завершать ?
    #39353974
Фотография Смузи
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
FungusМне нужно НЕ выполнить транзакцию и узнать были ли проблемы
Чтобы узнать, были ли проблемы, нужно обработать исключение. Поэтому без catch вообще никак.

Fungusв процессе выполнения транзакции выяснить ID созданных сущностей (Юзер, Роль)
Зачем выяснять ID сущностей, если они еще физически не добавлены в БД (и могут быть вообще не добавлены)?

Fungus например залогировать сразу, или например вставить в некий список, чтобы залогировать отдельно).
Еще раз, какой ID ты собираешься логировать, если его еще нет физически?

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

В сложности кода. Вот есть у нас такой простой AdoNet код:

Код: c#
1.
2.
var id = Insert()
Log(id);



Вы предлагаете его размазать в разные места программы. В одном месте вставлять юзера, а когда-то потом, где-то после чекина начинать вычислять какие там ID нагенерились, и логировать их.
Как вы себе это представляете вообще. Это наверное похоже на сложности программирование через Task.ContinueWith пожалуй. Когда в ContinueWith нам нужно выяснить что там было в начале передано первой задаче вообще.
...
Рейтинг: 0 / 0
EF. Как получить ID вставленной записи (для лога) если транзакцию рано завершать ?
    #39353981
Фотография Смузи
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
FungusskyANAFungus, в чём проблема создать сначала Юзера, Роли, закоммитить, а потом уже логировать?
В сложности кода.
Упрощай.

FungusВот есть у нас такой простой AdoNet код:

Код: c#
1.
2.
var id = Insert()
Log(id);



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

В сложности кода. Вот есть у нас такой простой AdoNet код:

Код: c#
1.
2.
var id = Insert()
Log(id);




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

Размажется. ладно я понял, что все не просто. Буду думать. Направление вы дали.
...
Рейтинг: 0 / 0
EF. Как получить ID вставленной записи (для лога) если транзакцию рано завершать ?
    #39353997
Фотография skyANA
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Да и на мой взгляд код должен быть другим:
Код: c#
1.
2.
3.
4.
5.
6.
var user = new User("Vasya");

user.Roles.Add(role: "dbOwner", db: "MainDatabase");
userRepository.Save(user);

log.Information("User successfully created (name: {Name}, roles: {Roles})", user.Name, user.Roles);
...
Рейтинг: 0 / 0
EF. Как получить ID вставленной записи (для лога) если транзакцию рано завершать ?
    #39354007
Fungus
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
skyANA,

В принципе это именно то, что мне и нужно.Похоже я ошибся разбив добавление Юзера и Ролей на отдельный функционал. Ввиду чего и возникла проблема "собрать все вместе по итогу". Поэтому и пришлось делать логирование непосредственно после вставки каждой сущности.Пожалуй ваше решение это прекрасный пример того, как нужно сделать правильно: выделить задачу как одну функцию, и в ее конце, имея на руках готовый итоговый результат, его и логировать.

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

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

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

А где я говорил про логгирование ошибок, можете показать в том коде где я описывал то, что мне нужно ? Человек видит то, что он хочет видеть. Вы захотели увидеть про логгирование ошибок ? :) Я говорил про логгирование ID сущностей, создаваемых в БД .

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

А где я говорил про логгирование ошибок, можете показать в том коде где я описывал то, что мне нужно ? Человек видит то, что он хочет видеть. Вы захотели увидеть про логгирование ошибок ? :) Я говорил про логгирование ID сущностей, создаваемых в БД .

тогда "логи" - это такие же domain, как и все остальные. и работа с ними ничем не отличается от всех остальных

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

Возможно.
Но все же не ясно. Если Entity записи лога выглядит иначе чем Entity, то как их увязать вместе ? Т.е. когда это разные сущности, но связанные своим ID, к примеру, не знаю. Можете пример кода подкинуть, я все же не эксперт в EF )
...
Рейтинг: 0 / 0
EF. Как получить ID вставленной записи (для лога) если транзакцию рано завершать ?
    #39354065
Фотография Смузи
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
FungusskyANA, В принципе это именно то, что мне и нужно.Похоже я ошибся разбив добавление Юзера и Ролей на отдельный функционал.
Ты издеваешься? Тебе именно это и предлагали изначально, даже пример запилили 19930542
...
Рейтинг: 0 / 0
EF. Как получить ID вставленной записи (для лога) если транзакцию рано завершать ?
    #39354067
Фотография Смузи
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
FungusЕсли Entity записи лога выглядит иначе чем Entity, то как их увязать вместе ?
Тебе битый день уже тылдычат

Save (успешно) => потом запись в лог
Save (не успешно) => потом запись в лог
...
Рейтинг: 0 / 0
57 сообщений из 57, показаны все 3 страниц
Форумы / WinForms, .Net Framework [игнор отключен] [закрыт для гостей] / EF. Как получить ID вставленной записи (для лога) если транзакцию рано завершать ?
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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