Many to many mapping with extra fields in Fluent API

ef-code-first entity-framework

Question

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)

1
26
5/23/2017 10:30:16 AM

Accepted Answer

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 });
46
8/22/2014 9:34:29 AM


Related Questions





Related

Licensed under: CC-BY-SA with attribution
Not affiliated with Stack Overflow
Licensed under: CC-BY-SA with attribution
Not affiliated with Stack Overflow