0

WCFとEntityFrameworkを介して簡単なユーザーメッセージングシステムをセットアップしたいと思います。私はアイデアをシンプルに保っています:

ユーザーは別のユーザーにメッセージを送信できます。

コンテキスト:ボブはビルにメッセージを送信しました。ビルはボブにメッセージを送りました。(スレッド化されていません)

グーグルでいろいろなアドバイスをよく読んでみました。結果は2つのクラスUserMessageです。

私はかなり混乱/行き詰まっています。したがって、私の質問は次のとおりです。私の実装には欠陥がありますか?もしそうなら、これを実装するための「より良い」方法はありますか?

ユーザークラス

public class User
{
    [Key, DatabaseGenerated(DatabaseGeneratedOption.Identity)]
    public Guid UserID { get; set; }

    public string Name { get; set; }

    public ICollection<Message> SentMessages { get; set; }

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

メッセージクラス

public class Message
{
    [Key, DatabaseGenerated(DatabaseGeneratedOption.Identity)]
    public Guid MessageID { get; set; }

    public DateTime CreatedOn { get; set; }

    public string Content { get; set; }

    public Guid SenderID { get; set; }

    public virtual User Sender { get; set; }

    public Guid AddresseeID { get; set; }

    public virtual User Addressee{ get; set; }

}

更新/編集:

説明をわかりやすくするために、質問に詳細を追加したいと思います。

リポジトリパターンを実装しました。したがって、上記のクラスを使用すると、ユーザーが送信したすべてのメッセージを簡単に取得できます。例えば

messageRepository.GetMessagesFromUserByUserID(Guid.Parse(id)).ToList();

public IEnumerable<Message> GetMessagesFromUserByUserID(Guid userID)
        {
            return context.Messages.Where(x => x.SenderID == userID).ToList();
        }

これはすべて問題ありません。問題は、Senderナビゲーションプロパティを使用して送信者の名前を取得したいので、クライアントがメッセージを受信すると、送信者を確認できることです。

ユーザーリポジトリを使用し、UserIDでユーザーを検索し、2つの結果を組み合わせることができますが、これは直感に反しているようです。

ついに; これを簡潔に表現できなかったことをお詫びし、追加情報がお役に立てば幸いです。

アップデート2:

Senderプロパティを使用しようとしました。Sender.Nameただし、エラーが発生します。DBを調べたところ、これが作成されていることがわかりました。ガイドが同じであるという事実を無視してください。

データベース画像

4

1 に答える 1

0

プロパティが正しいことを確認してくれた@LadislavMrnkaに感謝します。これは、非常に役立ちました。

だから私の答えは別のSOの質問から触発されました。モデルビルダーに次のように詳細を追加する必要がありました。

        modelBuilder.Entity<Message>()
                .HasRequired(m => m.Sender)
                .WithMany(t => t.MessagesSent)
                .HasForeignKey(m => m.SenderID)
                .WillCascadeOnDelete(false);

        modelBuilder.Entity<Message>()
                .HasRequired(m => m.Addressee)
                .WithMany(t => t.MessagesReceived)
                .HasForeignKey(m => m.AddresseeID)
                .WillCascadeOnDelete(false);
于 2012-04-28T10:01:40.137 に答える