Entity Framework Code First Relations
Introduction
This post is more for self-reference than anything else. Basically, I tend to forget some options for mapping relations with Entity Framework Code First, so I wrote this. If in doing so it helps someone, even better!
One-to-Many
First, the most basic: one-to-many/many-to-one: an instance of the Master class has lots of Details.
1: public class Master
2: {
3: public Int32 MasterId { get; set; }
4:
5: public virtual ICollection<Detail> Details { get; protected set; }
6: }
1: public class Detail
2: {
3: public Int32 DetailId { get; set; }
4:
5: public virtual Master Master { get; set; }
6: }
One-to-One
The stepchild of database relations. Sometimes it is useful, though: a single Master has an optional Detail, which always refers to an existing Master.
1: public class Master
2: {
3: public Int32 MasterId { get; set; }
4:
5: public virtual Detail Detail { get; set; }
6: }
1: public class Detail
2: {
3: [Key]
4: [ForeignKey("Master")]
5: public Int32 MasterId { get; set; }
6:
7: [Required]
8: public virtual Master Master { get; set; }
9: }
Many-to-Many
A single Master can have many Details; each Detail can itself be connected to multiple Masters.
1: public class Master
2: {
3: public Master()
4: {
5: this.Details = new List<Detail>();
6: }
7:
8: public Int32 MasterId { get; set; }
9:
10: public virtual ICollection<Detail> Details { get; protected set; }
11: }
1: public class Detail
2: {
3: public Detail()
4: {
5: this.Masters = new List<Master>();
6: }
7:
8: public Int32 DetailId { get; set; }
9:
10: public virtual ICollection<Master> Masters { get; protected set; }
11: }
One-to-Many With Composite Key
In this case we have a composite primary key constituted by a foreign key and a scalar column: a Master instance is related with many Details and each Detail is identified by both a single Master and a timestamp.
1: public class Master
2: {
3: public Master()
4: {
5: this.Details = new List<Detail>();
6: }
7:
8: public Int32 MasterId { get; set; }
9:
10: public virtual ICollection<Detail> Details { get; protected set; }
11: }
1: public class Detail
2: {
3: [Key]
4: [ForeignKey("Master")]
5: [Column(Order = 0)]
6: public Int32 MasterId { get; set; }
7:
8: [Required]
9: public virtual Master Master { get; set; }
10:
11: [Key]
12: [Column(Order = 1)]
13: public DateTime Timestamp { get; set; }
14: }
Have I forgotten something? Let me know!