.net 首先在实体框架代码中创建简单的用户消息传递设置

.net 首先在实体框架代码中创建简单的用户消息传递设置,.net,wcf,entity-framework,.net,Wcf,Entity Framework,我想通过WCF和实体框架建立一个简单的用户消息传递系统。我的想法很简单: 用户可以向其他用户发送消息 上下文:鲍勃给比尔发了一条消息。比尔给鲍勃捎了个口信。(非螺纹) 在通过谷歌大量搜索阅读各种建议后,我做了一次尝试。结果是两个类User和Message 我越来越糊涂了。因此,我的问题是:我的实现是否有缺陷?如果有,是否有“更好”的实现方法 用户类 public class User { [Key, DatabaseGenerated(DatabaseGeneratedOption.Id

我想通过WCF和实体框架建立一个简单的用户消息传递系统。我的想法很简单:

用户可以向其他用户发送消息

上下文:鲍勃给比尔发了一条消息。比尔给鲍勃捎了个口信。(非螺纹)

在通过谷歌大量搜索阅读各种建议后,我做了一次尝试。结果是两个类
User
Message

我越来越糊涂了。因此,我的问题是:我的实现是否有缺陷?如果有,是否有“更好”的实现方法

用户类

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();
        }
messageRepository.GetMessagesFromUserByUserID(Guid.Parse(id)).ToList();
public IEnumerable GetMessagesFromUserByUserID(Guid userID)
{
返回context.Messages.Where(x=>x.SenderID==userID.ToList();
}
这一切都很好。问题是我想使用Sender Navigation属性来获取发件人的名称,这样当客户端获取消息时,他们就可以看到消息来自谁

我可以使用我的用户存储库,按用户ID查找用户,并将这两个结果结合起来——但这似乎违反直觉

最后,;我很抱歉不能用简洁的方式表达这一点,希望额外的信息能有所帮助

更新2:

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


感谢@Ladislav Mrnka确认了酒店的产权,这帮了大忙

所以我的回答是从另一个问题中得到启发的。我只需要向模型生成器添加一些细节,如下所示:

        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);
modelBuilder.Entity()
.HasRequired(m=>m.Sender)
.WithMany(t=>t.MessagesSent)
.HasForeignKey(m=>m.SenderID)
.WillCascadeOnDelete(假);
modelBuilder.Entity()
.HasRequired(m=>m.收件人)
.WithMany(t=>t.messages接收)
.HasForeignKey(m=>m.AddresseeID)
.WillCascadeOnDelete(假);

这对我来说很好。这个问题更适合你。好吧,听起来我已经开始了。我的困惑已经转移到如何告诉EF,
SentMessages
是UserID==SenderID的消息,类似于
ReceivedMessages
。我认为这一切都与导航属性有关。我将为这个问题补充一些额外的细节。