ozgur
ozgur

Reputation: 2719

How to create one-to-one relationship between same table in Entity Framework 6 Code First?

Here is a simple representation of the two classes.

public class Person
{
    [Key]
    public int ID {get; set;}
    public virtual ICollection<Friendship> FShip{ get; set; }
}

    public class Friendship
    {
        [Key]
        public int ID { get; set; }

        [ForeignKey("Friend1ID")]
        public virtual Person Friend1{ get; set; }
        public int Friend1ID { get; set; }

        [ForeignKey("Friend2ID")]
        public virtual Person Friend2{ get; set; }
        public int Friend2ID{ get; set; }

        public double FriendshipScrore{ get; set; }
    }

When the table is created I was expecting two foreign keys for each friend. But there is another foreign key for Person table. Person_ID (which is the problem)

Below is the corresponding part in Migration code.

ForeignKey("dbo.Persons", t => t.Friend1ID, cascadeDelete: true)
.ForeignKey("dbo.Persons", t => t.Friend2ID, cascadeDelete: true)
.ForeignKey("dbo.Persons", t => t.Person_ID)
.Index(t => t.Friend1ID)
.Index(t => t.Friend2ID)
.Index(t => t.Person_ID);

Upvotes: 1

Views: 452

Answers (1)

Slava Utesinov
Slava Utesinov

Reputation: 13488

You should also tune Person class to specify explicitly links to Friend1 set and Friend2 set at Friendship class:

    public class Person
    {
        [Key]
        public int ID {get; set;}

        [InverseProperty("Friend1")]
        public virtual ICollection<Friendship> FShip1{ get; set; }

        [InverseProperty("Friend2")]
        public virtual ICollection<Friendship> FShip2{ get; set; }

        [NotMapped]
        public List<Friendship> FShip{ get { 
                  return FShip1.Union(FShip2).ToList();
             } 
        }
    }

Upvotes: 2

Related Questions