How to add a column to a link table with code first
I have a ResearchDatabase entity that has a many-to-many relationship with a Subject entity. i.e. a Research Database belongs in one or more Subject Categories, and a Subject Category contains one or more Research Databases.
In my ResearchDatabaseConfiguration file I have the following mapping:
HasMany(rd => rd.Subjects) .WithMany(s => s.ResearchDatabases) .Map(m => { m.MapLeftKey("DatabaseId"); m.MapRightKey("SubjectId"); m.ToTable("DatabaseSubjects"); });
OK, no problem. Works. Creates a link table.
Now I have received a new specification. The ordering of the Research Databases in each subject is going to be split up with the most relevant fir开发者_如何学Cst (as deemed by a user) in alphabetical order, followed by a second set of 'if you didn't find it, try these also' databases, also in alphabetical order. So, basically, I need another column to signify if the database is in the first or second group. Something like an IsPrimary column, or something like that inside the link table itself. I hope that makes sense.
But, how do I add an extra column to the link table that is created from the above mapping code?
It's not possible. The many-to-many join table is managed internally by Entity Framework and it must only contain the two key columns. You cannot customize this table.
What you need to do is:
- Introduce a new entity into your model which represents the data in the join table (
public class DatabaseSubject
or something). You can customize this entity now as you like, for example add anIsPrimary
property. - Remove the many-to-many mapping
- Instead create two one-to-many relationships between
DatabaseSubject
andResearchDatabase
(one ResearchDatabase has many DatabaseSubjects) and betweenDatabaseSubject
andSubject
(one Subject has many DatabaseSubjects).
A more detailed description of such a scenario is here: Create code first, many to many, with additional fields in association table
精彩评论