I've a one-to-many / many-to-many relationship b/w UserProfile
& AddressMaster
through intermediate table UserAddress
.
public class UserProfile
{
public string UserID { get; set; }
public string Name{ get; set; }
public ICollection<UserAddress> UserAddress{ get; set; }
}
public class AddressMaster
{
public string AddrID{ get; set; }
public string AddressLine1{ get; set; }
public ICollection<UserAddress> UserAddress{ get; set; }
public TheatreLocation TheatreLocation { get; set; }
}
public class UserAddress
{
public Guid UserID { get; set; }
public Guid AddressID { get; set; }
public UserProfile UserProfile{ get; set; }
public AddressMaster AddressMaster { get; set; }
}
Now I am trying to enter data from API through JSON:
{
"Name": "Neo",
"address":
{
"addressLine1": "House not"
}
}
For this I've a DTO to take these params. Below is my controller code.
public async Task<Guid> Handle(CreateUserCommand request, CancellationToken cancellationToken)
{
var userEntity = new UserProfile
{
Name = request.Name,
};
_context.UserProfile.Add(userEntity);
AddressMaster addressMaster = request.Address;
_context.AddressMaster.Add(addressMaster);
UserAddresses userAddresses = new UserAddresses
{
AddressID = addressMaster.AddressID,
UserID = userEntity.UserID
};
_context.UserAddresses.Add(userAddresses);
await _context.SaveChangesAsync(cancellationToken);
return userEntity.UserID;
}
I am trying to store data individually into respective tables and then tried to map it to the intermediate table. I am not quiet sure thats right way, but data is getting stored in the db though.
Thanks :)
It looks like since there has not been any answer and after looking up some examples, I figured the answer in my question itself is the right way to proceed.
Consider the records you want to enter:
AddressMaster
<---> UserAddress
<---> UserProfile
Provided the entity configuration is already configured using fluent API (many-to-many requires to configure fluent API for now) mapping AddressID
and UserID
as Foreign key to the UserAddress table.
Now you individually map the respective data into both the AddressMaster
and UserProfile
tables and add it to the context.
var userEntity = new UserProfile
{
Name = request.Name,
};
_context.UserProfile.Add(userEntity);
AddressMaster addressMaster = request.Address;
_context.AddressMaster.Add(addressMaster);
Now you map those entered entities to the UserAddresses
entity and save the changes.