2011-05-06 4 views
0

J'essaye d'utiliser d'abord le code EF pour créer une base de données mais je ne suis pas sûr de savoir comment définir les classes pour la relation suivante afin qu'elle soit efficace.EF Code First ASP.NET C# Conception

Nous avons un utilisateur et l'utilisateur a des amis, qui à son tour est une collection de l'utilisateur, donc je pensais à ce qui suit POCO classe

`//Class User 
public class User 
{ 
    public Guid UserId{get;set;} 
    public string UserName{get;set;} 
    public String UserAddress{get;set;} 
    // other user properties 
} 

//Class Friend 
public class Friend 
{ 
    public Guid FriendId{get;set;} //unique identifier for Friend Table 
    public virtual User CurrentUser{get;set;} 
    public List<User> lstUserFriends {get;set;} //contains list of all friends that the  user has 

}` 

Est-ce bien paraître sage performances ou pensez-vous que vous peut suggérer une alternative?

+3

Il semble un peu étrange pour moi ... Qu'est-ce que mon ami? Qu'est-ce qui ne fait pas des "amis" une propriété de l'utilisateur? (clé étrangère auto-référencée) – turtlepick

Répondre

4

Pourquoi ne pas simplement faire

public class User 
{ 
    public Guid UserId{get;set;} 
    public string UserName{get;set;} 
    public String UserAddress{get;set;} 
    public IList<User> Friends{get;set;} 
    // other user properties 
} 
+0

Cela semble créer uniquement une relation un à un entre chaque utilisateur car sa colonne MembermemberId est créée sur chaque ligne membre de la même table. –

3

Vous avez besoin d'autoréférencement plusieurs à-plusieurs parce que l'utilisation peut avoir beaucoup d'amis, mais peut aussi être ami de nombreux utilisateurs.

public class User 
{ 
    public Guid UserId { get; set; } 
    public string UserName { get; set; } 
    public String UserAddress { get; set; } 

    [InverseProperty("Friends")] 
    public virtual ICollection<User> FriendWith { get; set; } 
    [InverseProperty("FriendWith")] 
    public virtual ICollection<User> Friends { get; set;} 
} 

Ou vous pouvez omettre InverseProperty annotation de données et utiliser le mappage couramment:

protected override void OnModelCreating(DbModelBuilder modelBuilder) 
{ 
    modelBuilder.Entity<User>() 
       .HasMany(u => u.Friends) 
       .WithMany(f => f.FriendWith); 
    // I'm not sure but you can also need to add this: 
    //   .WillCascadeOnDelete(false); 
} 
+0

Excellente réponse, vous venez de me sauver quelques heures. – croisharp

Questions connexes