EF4.1 Отношение «многие ко многим»: DisplayInInbox для каждого пользователя - PullRequest
0 голосов
/ 30 апреля 2011

По какой-то причине я не могу разобраться с этим ... У меня есть система личных сообщений, которая позволяет пользователям отправлять друг другу PM.Пользователь также может удалить сообщение из своего почтового ящика, но когда это происходит, его не следует удалять из почтового ящика другого пользователя.Для этого я считаю, что между сущностями «Пользователь» и «Сообщение» должно быть много-много отношений.Но как мне сопоставить это отношение, чтобы пользователи могли удалять сообщения из своего почтового ящика (для которого я решил создать логическое значение: DisplayInInbox) и не удалять его из почтового ящика другого пользователя?

Моя текущая модель, которая не работает, выглядит следующим образом:

public class Message
{
    public int Id { get; set; }
    [MaxLength(150)]
    public string Subject { get; set; }
    [MaxLength(3000)]
    public string Content { get; set; }
    public DateTime DateSent { get; set; }
    public DateTime? LastViewed { get; set; }
    public bool IsRead { get; set; }
    public bool DisplayInInbox { get; set; } 
    public int? ParentId { get; set; }
}

и в классе пользователя у меня есть это свойство:

    public virtual ICollection<Message> ReceivedMessages { get; set; }

Нужно ли мне два логических значения или одного будет достаточно?И как мне в конечном итоге отобразить это отношение?

ОБНОВЛЕНИЕ:

Хорошо, теперь вот моя модель:

public class Inbox
{
    [Key, Column(Order = 0), ForeignKey("User")]
    public int UserId { get; set; }
    [Key, Column(Order = 1), ForeignKey("Message")]
    public int MessageId { get; set; }

    public DateTime? LastViewed { get; set; }
    public bool IsRead { get; set; }

    public virtual Message Message { get; set; }
    public virtual User Sender { get; set; }
    public virtual User Receiver { get; set; } 
}

public class Message 
{
    public int Id { get; set; }
    [MaxLength(150)]
    public string Subject { get; set; }
    [MaxLength(3000)]
    public string Content { get; set; }
    public DateTime DateSent { get; set; }
    public int? ParentId { get; set; }
    public virtual ICollection<Inbox> ReceivedBy { get; set; }
    public virtual ICollection<Inbox> SentBy { get; set; }
}

И в классе User:

    public virtual ICollection<Inbox> ReceivedMessages { get; set; }

1 Ответ

1 голос
/ 30 апреля 2011

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

Проблема в том, что вы хотите сохранить некоторую дополнительную информацию, связанную с сообщением и пользователем. Из-за этого вы должны представить таблицу соединений как отдельную сущность:

// The message
public class Message
{
    public int Id { get; set; }
    [MaxLength(150)]
    public string Subject { get; set; }
    [MaxLength(3000)]
    public string Content { get; set; }
    public DateTime DateSent { get; set; }

    [ForeignKey("ParentMessage")]       
    public int? ParentId { get; set; }
    [ForeignKey("Sender")]
    public int SenderId { get; set; }

    ...

    public virtual Message ParentMessage { get; set; }
    public virtual ICollection<Inbox> ReceivedBy { get; set; }
    public virtual User Sender { get; set; }
}

public class Inbox
{
    [Key, Column(Order = 0), ForeignKey("User")]
    public int UserId { get; set; } 
    [Key, Column(Order = 1), ForeignKey("Message")]
    public int MessageId { get; set; }

    public DateTime? LastViewed { get; set; }
    public bool IsRead { get; set; } 

    public virtual Message Message { get; set; }
    public virtual User User { get; set; }
}

public class User
{
    public int Id { get; set; }
    ...
    public virtual ICollection<Inbox> ReceivedMessages { get; set; }
    public virtual ICollection<Message> SendMessages { get; set; }
}

Теперь удаление сообщения из почтового ящика пользователя просто означает удаление записи из ReceivedMessages, но оно не удалит сообщение - оно удалит только запись в таблице Inbox.

Edit:

Я обновил пример кода для поддержки всех ваших дополнительных требований. Сейчас:

  • Каждый Message может иметь несколько приемников
  • Получение Message осуществляется отдельной сущностью, называемой Inbox, которая позволит вам удалять сообщения за User и использовать такие свойства, как IsRead за User.
  • Message имеет необязательные значения ParentId и ParentMessage, так что вы можете отслеживать реакции / ответы на другие сообщения.
  • Message имеет Sender и SenderId и в то же время User имеет коллекцию отправленных сообщений. На мой взгляд, Message отправляется одним User, поэтому это отношение не имеет ничего общего с Inbox и должно быть непосредственно между Message и User.
...