- ABP Framework version: v4.4.3
- UI type: Blazor
- DB provider: EF Core
- Tiered (MVC) or Identity Server Separated (Angular): no
- Exception message and stack trace:
- Steps to reproduce the issue:"
I would like to know what is the best practice using ABP for creating a Many to Many relationship with IdentityUser? With Core EF5 we can add nav properties to our entities to make this easy, as documented here : https://www.davidhayden.me/blog/ef-core-5-many-to-many-relationships.
I created 2 test case entities, M2MUser & M2MGroup, added the navigation collections i.e. ' public ICollection<M2MUser> M2MUsers { get; set; } ' in the domain project and ran a DB Migration and everything worked as it should do, the M2MUserM2MGroup table was created in the DB.
However we can not add a collection property to the IdentityUser class, and there is no longer a derived ABPUser class. If we want to add an M2M relationship with a 'User' should we wrap IdentityUser? This seems like the wrong way forward, am I missing something? Can you please provide the best practice, using ABP, for this situation?
If this helps, here is the part of my model that I am trying to implement. 'User' is an IdentityUser. 'OnboardingGoal' is an entity I have created using ABPSuite. UserOnboardingGoal should be implicitly generated by EF, so it is not explicitly created using ABPSuite.
Thanks,
Karim
1 Answer(s)
-
0
Hi,
You directly add many-to-many navigation properties for your own entitys, but not
IdentityUser
, because theIdentityUser
is a pre-built entity.The best way to pre-build entities to add a many-to-many relationship is to use an middle table.
Example:
public class MyGroup : Entity<Guid> { public string Name { get; set; } public List<UserGroup> Users { get; set; } } public class UserGroup : Entity { public Guid GroupId { get; set; } public MyGroup Group { get; set; } public Guid UserId { get; set; } public IdentityUser User { get; set; } public override object[] GetKeys() { return new object[] { UserId, GroupId }; } } builder.Entity<MyGroup>(b => { b.ConfigureByConvention(); }); builder.Entity<UserGroup>(b => { b.HasKey(x => new { x.UserId, x.GroupId }); b.HasOne(x => x.Group).WithMany(x => x.Users).HasForeignKey(x => x.GroupId); b.HasOne(x => x.User).WithMany().HasForeignKey(x => x.UserId); });