0

我想通过 WCF 和实体框架设置一个简单的用户消息传递系统。我保持简单的想法:

一个用户可以向另一个用户发送消息。

背景:鲍勃给比尔发了一条消息。比尔给鲍勃发了一条消息。(未穿线)

在通过谷歌搜索大量阅读各种建议后,我做出了尝试。结果是两个类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:

我曾尝试使用 Sender 属性,例如。Sender.Name但是我收到一个错误。我去查看数据库,发现这是正在生产的。请忽略指南相同的事实。

数据库映像

4

1 回答 1

0

感谢@Ladislav Mrnka 确认属性正确,这很有帮助。

所以我的回答受到了另一个 SO question 的启发。我只需要像这样向模型构建器添加一些细节:

        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 回答