2013-08-13 4 views
0

Я создал свою собственную модель базы данных, используя Entity Framework Code Сначала с последней версией Entity Framework.Удалите отношения, используя Entity Framework Code First

У меня есть этот класс:

[DataContract] 
public class User 
{ 
    [DataMember] 
    public int UserId { get; set; } 

    [DataMember] 
    public string Name { get; set; } 

    [DataMember] 
    public int Age { get; set; } 

    [DataMember] 
    public string City { get; set; } 

    [DataMember] 
    public string Country { get; set; } 

    [DataMember] 
    public string Email { get; set; } 

    [DataMember] 
    public string InterestIn { get; set; } 


    [DataMember] 
    public virtual ICollection<User> Friends { get; set; } 

    [DataMember] 
    public virtual ICollection<User> FromWhomIsFriend { get; set; } 

    [DataMember] 
    public virtual ICollection<Activity> WantsToDo { get; set; } 

    [DataMember] 
    public virtual ICollection<Message> MessagesSent { get; set; } 

    [DataMember] 
    public virtual ICollection<Message> MessagesReceived { get; set; } 

    public override string ToString() 
    { 
     string output = string.Empty; 

     output = String.Format("UserId: {0}, Name: {1}, Age: {2}, City: {3}, " + 
      "Country: {4}, Email: {5}, InterestIn: {6}", 
      UserId, Name, Age, City, Country, Email, InterestIn); 

     return output; 
    } 
} 

и его класс конфигурации:

class UserConfiguration : EntityTypeConfiguration<User> 
{ 
    public UserConfiguration() 
    { 
     Property(d => d.Name).IsRequired(); 
     Property(d => d.Age).IsRequired(); 
     Property(d => d.City).IsRequired(); 
     Property(d => d.Country).IsRequired(); 
     Property(d => d.Email).IsRequired(); 
     Property(d => d.InterestIn).IsRequired(); 

     HasMany(d => d.MessagesSent).WithRequired(l => l.SentByUser).WillCascadeOnDelete(false); 
     HasMany(d => d.MessagesReceived).WithRequired(l => l.SentToUser).WillCascadeOnDelete(false); 

     HasMany(d => d.Friends). 
      WithMany(d => d.FromWhomIsFriend). 
      Map(c => 
       { 
        c.ToTable("UserFriends"); 
        c.MapLeftKey("UserId"); 
        c.MapRightKey("FriendId"); 
       }); 
     HasMany(d => d.WantsToDo). 
      WithMany(a => a.Users). 
      Map(t => 
       { 
        t.ToTable("UserActivities"); 
        t.MapLeftKey("UserId"); 
        t.MapRightKey("ActivityId"); 
       }); 
    } 
} 

Чтобы представить это многие-ко-многим себе отношения:

enter image description here

Теперь я есть проблема: я не знаю, как удалить отношения друзей. С SQL я буду делать что-то вроде этого:

DELETE FROM UserFriend 
WHERE (userId = user1_id AND friendId = friend1_id) OR 
     (userId = friend1_id AND friendId = user1_id) 

user1_id: является ли пользователь, который хочет, чтобы удалить отношения друга. friend1_id: Друг user1 хочет удалить как друга.

Как я могу это сделать?

ответ

0

Просто удалить друга из коллекции:

user.Friends.Remove(friendToRemove); 
+0

Спасибо за ваш ответ. И как насчет 'FromWhomIsFriend'? Должен ли я делать то же самое с этой коллекцией? – VansFannel

+0

Если вы используете прокси (ваши коллекции являются виртуальными), то ассоциация fixup будет выполняться прокси ('user' будет удален из' friendToRemove.FromWhomIsFriend'). – Dennis

0

Итак, если я правильно undestand, если пользователь User1 дружит с Пользователю2, отношения будут либо в user1.Friends или в user1.FromWhomIsFriend.

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

public void RemoveFriend(User user, User friend) 
{ 
    if (user1.Friends.Contains(friend)); 
     user1.Friends.Remove(friend); 
    if (user1.FromWhomIsFriend.Contains(friend)); 
     user1.FromWhomIsFriend.Remove(friend); 
} 
Смежные вопросы