Provide us with the following info:
- ABP Framework version: ABP CLI 7.3.0
- UI Type: Blazor Server
- Database System: EF Core (SQL Server)
- Tiered (for MVC) or Auth Server Separated (for Angular): Yes
- Exception message and full stack trace: NA
- Steps to reproduce the issue: Probably applicable
I have enabled ABP framework to post message to Kafka using the builtin mechanism (not PublishAsync()
). The message gets posted correctly. But for the CREATED event, the ID = 0. I expected the newly assigned ID to be available in the message. The newly assigned application is available to the code after CreateAsync()
call in the AppService. I expected this ID to be available in the message also. Am I missing any configuration?
Example:
Let me know what additional information do you need ?
8 Answer(s)
-
0
Hi,
You should manually assign the
ID
when creating the entity, for example:https://docs.abp.io/en/abp/latest/Best-Practices/Entities#example https://github.com/abpframework/abp/blob/dev/modules/identity/src/Volo.Abp.Identity.Application/Volo/Abp/Identity/IdentityUserAppService.cs#L78
-
0
Well, I cannot assign the ID manually in the EF (SQL Server) world, because it is being generated in the database by the identity column during insert. You may notice in the message
"Id"=0
.Doesn't ABP framework have any mechanism for database generated
int
identity-column entities? -
0
Hi,
You can consider specifying
autosave
to create an entity._myRepositpry.InsertAsync(..., autoSave: true)
-
0
Hi, I tried this approach it did not work, still Id coming up as 0.
-
0
I will check it
-
0
Hi,
This is a limitation of EFCore, for the int type, the default value is 0, and ABP can't get the ID value in the entity tracking event.
I have the following suggestions:
- Use
GUID
as best practice instead ofint
- Subscribe to local events instead of distributed events for int primary key type entities. for example:
public async Task<Book> CreateAsync(string name) { var book = new Book(name); return await _bookRepository.InsertAsync(book, autoSave: true); } public class MyHandler : ILocalEventHandler<EntityCreatedEventData<Book>>, ITransientDependency { public async Task HandleEventAsync(EntityCreatedEventData<Book> eventData) { var id = eventData.Entity.Id; } }
- Use
-
0
So switching from ID to GUID is out of question at this point in our application development process.
InsertAsync() is returning me the ID. So I do not think I need to handle HandleEventAsync() to get the ID.
If the above statements are correct. then PublishAsync() seems to be the only option for me. And if that is the way to go, then is it enough to remove just this code to stop any default Kafka Publish or do you suggest a different method?
Configure<AbpDistributedEntityEventOptions>(options => { //Enable for Location entity options.AutoEventSelectors.Add<X>(); options.EtoMappings.Add<X, Y>(); });
-
0
Ok
If the above statements are correct. then PublishAsync() seems to be the only option for me
Two options,
- Subscribe to local events instead of distributed events for int primary key type entities.
- Publishing events manually via PublishAsync()