EF Code First ASP.NET C # Дизайн - PullRequest
0 голосов
/ 06 мая 2011

Сначала я пытаюсь использовать EF Code для создания базы данных, но я не уверен, как определить классы для следующих отношений, чтобы они были эффективными.

У нас есть Пользователь, а у Пользователя есть Друзья,который, в свою очередь, является коллекцией User, поэтому я подумал о следующем классе POCO

`//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

}`

Это выглядит хорошо с точки зрения производительности или вы думаете, что можете предложить альтернативу?

Ответы [ 2 ]

4 голосов
/ 06 мая 2011

Почему бы просто не сделать

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
}
3 голосов
/ 06 мая 2011

Вы должны самостоятельно ссылаться на отношение «многие ко многим», потому что использование может иметь много друзей, но также может быть другом многих пользователей.

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;} 
}

Или вы можете опустить аннотацию данных InverseProperty и использовать свободное отображение:

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);
}
...