How about this:
public class FriendsMap : EntityTypeConfiguration<Friends> { HasKey(m => new { m.userId1 , m.userId2 }); this.HasRequired(x => x.User1) .WithMany() .HasForeignKey(x => x.User1Id) .WillCascadeOnDelete(false); this.HasRequired(x => x.User2) .WithMany(u => u.FriendsCol) .HasForeignKey(x => x.User2Id) .WillCascadeOnDelete(false); } public class UserMap : EntityTypeConfiguration<UserNew> { public UserMap() { ToTable("users"); Property(user => user.Name).HasColumnName("name"); } }
Edit:
I just made a very simple example and it works without problems:
class Program { static void Main(string[] args) { using (var context = new Context()) { context.Database.Delete(); context.Database.CreateIfNotExists(); var u1 = new User() { Name = "A" }; var u2 = new User() { Name = "B" }; var u3 = new User() { Name = "C" }; var f1 = new Friends() { User1 = u1, User2 = u2}; var f2 = new Friends() { User1 = u1, User2 = u3 }; context.Friends.Add(f1); context.Friends.Add(f2); context.SaveChanges(); } } } public class User { public int UserId { get; set; } public string Name { get; set; } public virtual ICollection<Friends> FriendsCol { get; set; } } public class Friends { public int User1Id { get; set; } public int User2Id { get; set; } public User User1 { get; set; } public User User2 { get; set; } } public class Context : DbContext { public DbSet<User> Users { get; set; } public DbSet<Friends> Friends { get; set; } protected override void OnModelCreating(DbModelBuilder modelBuilder) { base.OnModelCreating(modelBuilder); modelBuilder.Entity<Friends>() .HasKey(m => new { m.User1Id, m.User2Id }); modelBuilder.Entity<Friends>() .HasRequired(x => x.User1) .WithMany() .HasForeignKey(x => x.User1Id) .WillCascadeOnDelete(false); modelBuilder.Entity<Friends>() .HasRequired(x => x.User2) .WithMany(u => u.FriendsCol) .HasForeignKey(x => x.User2Id) .WillCascadeOnDelete(false); } }
source share