powered by simpleCommunicator - 2.0.53     © 2025 Programmizd 02
Форумы / WinForms, .Net Framework [игнор отключен] [закрыт для гостей] / EF. Как получить ID вставленной записи (для лога) если транзакцию рано завершать ?
25 сообщений из 57, страница 2 из 3
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
25 сообщений из 57, страница 2 из 3
Форумы / WinForms, .Net Framework [игнор отключен] [закрыт для гостей] / EF. Как получить ID вставленной записи (для лога) если транзакцию рано завершать ?
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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