0

私はEntity Framework 4.1 - Code Firstを使用しています。私はUserMessageエンティティの間に多対多の関係があります。この関係は別のエンティティ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); 
    } 

だからここで私が間違って行くのですか?

+0

どのような結果型が代入の右部分から使われているのか分かりますが、 'GetReplies'の場合は返す型と' foreach'が取り除いているものは分かりません。 –

+0

@Ladislav Mrnka:それは 'IList 'を返しています:) – Kassem

答えて

1

ナビゲーションプロパティからエンティティを削除しても、削除済みとしてマークされません。それは関係のみを削除します。つまり、UserMessageのFKはヌルに設定され、ヌル可能でない場合は例外が発生します。

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

編集: - ないMessage

言及したコードはUserMessageを削除あなたのような何かをする必要があります。あなたのモデルについて考えると、あなたの新しい問題は明らかです。あなたの最初の例外はUserMessageエンティティの多重度の制約によって発生しました - Receiverは必須です。UserMessage全体を削除せずにリレーションシップを削除することはできませんが、UserMessageを削除すると(メッセージの他の受信者はありません)よく

モデルが間違っています。 Receiverをオプションにしても、受信者なしのUserMessageインスタンスが生成されます。受信者リストをどこかに保存しないと、元の受信者に関する情報が失われます(送信者が送信者からメッセージを再度開いたときには、 。

+0

@Ladislav Mrnka:メッセージ自体も削除するべきではありませんか?私がそれをしたとき、それは問題を解決しましたが、新しい問題が生じました。他のユーザー(最初にメッセージを送信したユーザー)とログインしたとき、nullのオブジェクト参照例外が発生しました...それが私が避けようとしていたものです... – Kassem

+0

私は自分の答えを編集しました。 –

+0

@ Ladislav Mrnka:だから私はすべてを再モデリングする必要がありますか、またはUserMessageに "ReceiverName"を追加すると問題が解決されますか?また、DataAnnotationsを使用してレシーバをオプションにすることはできますか?または流暢な設定を使用する必要がありますか? – Kassem

関連する問題