Ответ 1
Лично мне нравятся GUID для уникальных идентификаторов, особенно в многопользовательских распределенных средах, где числовые идентификаторы вызывают проблемы. Таким образом, я никогда не использую базы данных с идентификационными столбцами/свойствами, и эта проблема исчезает.
В дополнение к этому, поскольку вы следите за CQRS, у вас, несомненно, есть CreateSomethingCommand и соответствующий CreateSomethingCommandHandler, который на самом деле выполняет шаги, необходимые для создания нового экземпляра, и сохраняет новый объект с помощью репозитория (через context.SaveChanges). Я буду поднимать событие SomethingCreated здесь, а не в самом объекте домена.
Во-первых, это решает вашу проблему, потому что обработчик команд может дождаться завершения операции с базой данных, вытащить значение идентификатора, обновить объект и передать идентификатор в событии. Но, что еще более важно, он также обращается к сложному вопросу о том, когда именно объект "создан"?
Поднятие события домена в конструкторе - это плохая практика, поскольку конструкторы должны быть тонкими и просто выполнять инициализацию. Кроме того, в вашей модели объект не создается до тех пор, пока он не присвоит идентификатор. Это означает, что после выполнения конструктора требуются дополнительные шаги инициализации. Если у вас более одного шага, вы выполняете порядок выполнения (другой анти-шаблон) или ставите чек в каждом, чтобы узнать, когда все это сделано (ох, вонючий)? Надеюсь, вы увидите, как это может быстро вырваться из-под контроля.
Итак, моя рекомендация - поднять событие из обработчика команд. (ПРИМЕЧАНИЕ. Даже если вы переключитесь на идентификаторы GUID, я буду следовать этому подходу, потому что вы никогда не должны поднимать события из конструкторов.)