#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. Отличный ответ, вы только что сэкономили мне пару часов.