Удалить сообщение из папки «Входящие» - PullRequest
0 голосов
/ 26 июня 2011

Я использую Entity Framework 4.1 - Code First, и у меня есть отношения многие ко многим между моими User и Message сущностями. Отношения отображаются через другую сущность UserMessage. Система обмена сообщениями, которую я реализовал, напоминала Gmail, что означает, что сообщения являются «потоками», где ответы на сообщение отображаются вдоль исходного сообщения.

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

Отношения от 'UserMessage_Receiver' AssociationSet находится в состоянии «Удалено». Дано ограничения множественности, а соответствующий UserMessage_Receiver_Source должен также в состоянии «Удалено».

Вот этот код:

public class UserMessage
{
    public int Id { 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 void DeleteFromInbox(int messageId, User user)
    {
        var message = _repository.First<UserMessage>(c=>c.Message.Id.Equals(messageId));
        var replies = GetReplies(user, messageId);
        foreach (var reply in replies)
        {
            if (user.ReceivedMessages.Contains(reply))
            {
                user.ReceivedMessages.Remove(reply);
                reply.Receiver = null;
            }
            if (user.SentMessages.Contains(reply))
            {
                user.SentMessages.Remove(reply);
                reply.Sender = null;
            }
        }
        message.Receiver = null;
        user.ReceivedMessages.Remove(message);
    }

Так, где я ошибся?

1 Ответ

1 голос
/ 26 июня 2011

Удаление объекта из свойства навигации не помечает его как удаленное. Это только удалит отношение - это означает, что для FK в UserMessage будет установлено значение NULL, а если оно не обнуляется, вы получите исключение. Вы должны сделать что-то вроде:

    foreach (var reply in replies)
    {
        if (user.ReceivedMessages.Contains(reply))
        {
            user.ReceivedMessages.Remove(reply);
            reply.Receiver = null;
        }

        if (user.SentMessages.Contains(reply))
        {
            user.SentMessages.Remove(reply);
            reply.Sender = null;
        }

        _repository.Delete(reply);
    }

Edit:

Указанный код удаляет UserMessage - не Message. Когда я думаю о вашей модели, ваша новая проблема очевидна. Ваше первое исключение было вызвано ограничениями множественности для объекта UserMessage - Receiver является обязательным, поэтому вы не можете удалить отношение к получателю, не удалив целое UserMessage, но после удаления UserMessage (и другого получателя сообщения нет ) он также удалит его из отправителя.

Ваша модель неверна. Даже если вы сделаете Receiver необязательным, это приведет к UserMessage экземплярам без получателя, и если вы не сохраните список получателей где-то еще, вы потеряете информацию об одном из исходных получателей (когда отправитель снова откроет сообщение из своего почтового ящика, он, скорее всего, не будет см. приемник).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...