Первый EF-код ASP.NET Дизайн на C #

#c# #asp.net-mvc-3 #code-first #entity-framework-4.1

#c# #asp.net-mvc-3 #первый код #entity-framework-4.1

Вопрос:

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

У нас есть пользователь, а у пользователя есть друзья, которые, в свою очередь, являются коллекцией пользователей, поэтому я подумал о следующем классе 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

}`
  

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

Комментарии:

1. Для меня это выглядит немного странно… Что такое друг? Почему бы не сделать «Друзей» свойством пользователя? (внешний ключ, ссылающийся на себя)

Ответ №1:

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

 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
}
  

Комментарии:

1. Похоже, что это создает только взаимно однозначное отношение между каждым пользователем, поскольку в каждой строке элемента в одной таблице создается столбец MembermemberId.

Ответ №2:

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

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

Комментарии:

1. Отличный ответ, вы только что сэкономили мне пару часов.