I have a many to many relationship and I want to store extra data in the couple-table, using Code First Fluent API.
How can this be achieved ?
My model:
A user can have 1 or more badges (optional), a badge can belong to one or more users (optional). I want to store an extra field (called B) for this relation to be stored. The table should be named UserBadges with the following fields: UserId, BadgeId, B
(I have seen this earlier in StackOverflow here, but I the model is somewhat complex and no answer has been given correctly yet)
You cannot map it as many-to-many directly. If you add additional field to the junction table and you want to access that field in the application you need to promote your junction table to entity instead and use two one-to-many relations:
public class Badge {
...
public virtual ICollection<UserBadge> UserBadges { get; set; }
}
public class User {
...
public virtual ICollection<UserBadge> UserBadges { get; set; }
}
public class UserBadge {
public int UserId { get; set; }
public int BadgeId { get; set; }
public string B { get; set; }
public virtual Badge Badge { get; set; }
public virtual User User { get; set; }
}
The default conventions should define the mapping correctly except the key for UserBadge
table which must be done either in Fluent-API or data annotations.
modelBuilder.Entity<UserBadge>().HasKey(e => new { e.UserId, e.BadgeId });
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With