4

Je suis tring pour comprendre comment représenter les amitiés entre les utilisateurs avec Entity Framework (5) Code First. Mon idée initiale était de créer une classe Friendship qui contienne des références à deux instances User, afin que les amitiés soient représentées par des objets séparés.Comment dois-je modéliser d'abord les amitiés entre les utilisateurs avec le code EF?

public class Friendship 
{ 
    public virtual int Id { get; set; } 
    [Required] 
    public virtual UserProfile User1 { get; set; } 
    [Required] 
    public virtual UserProfile User2 { get; set; } 
    [Required] 
    public virtual DateTime Since { get; set; } 
} 

[Table("UserProfile")] 
public class UserProfile 
{ 
    [Key] 
    [DatabaseGeneratedAttribute(DatabaseGeneratedOption.Identity)] 
    public int UserId { get; set; } 
    [Required] 
    public string UserName { get; set; } 
} 

Lorsque vous essayez de créer la base de données via EF Migrations, cependant, je suis perplexe en raison d'une erreur SQL:

Introducing FOREIGN KEY constraint 'FK_dbo.Friendships_dbo.UserProfile_User2_UserId' on table 'Friendships' may cause cycles or multiple cascade paths. Specify ON DELETE NO ACTION or ON UPDATE NO ACTION, or modify other FOREIGN KEY constraints. 

Suggestions quant à la façon de résoudre ce problème serait la bienvenue.

Répondre

5

J'ai réussi à trouver une question similaire sur SO après un peu plus de googling, et il y a une solution là-bas qui a au moins fait dans la base de données sans problèmes.

Fondamentalement, j'ai ajouté des clés étrangères par utilisateur à la classe Friendship, fait leur une clé primaire composite et configuré la deuxième clé étrangère de ne pas en cascade sur supprimer. J'ai fini par utiliser la configuration EF fluide.

public class Friendship 
{ 
    public virtual int UserId1 { get; set; } 
    public virtual int UserId2 { get; set; } 
    public virtual User User1 { get; set; } 
    public virtual User User2 { get; set; } 
    public DateTime since; 
} 

protected override void OnModelCreating(DbModelBuilder modelBuilder) 
{ 
    ... 
    modelBuilder.Entity<Friendship>().HasKey(f => new { f.UserId1, f.UserId2 }); 
    modelBuilder.Entity<Friendship>() 
     .HasRequired(f => f.User1) 
     .WithMany() 
     .HasForeignKey(f => f.UserId1); 
    modelBuilder.Entity<Friendship>() 
     .HasRequired(f => f.User2) 
     .WithMany() 
     .HasForeignKey(f => f.UserId2) 
     .WillCascadeOnDelete(false); 
} 
Questions connexes