出于某种原因,我无法理解这一点...我有一个私人消息系统,允许用户发送彼此的PM。用户还可以从他/她的收件箱中删除邮件,但是当发生这种情况时,不应该从其他用户的收件箱中删除该邮件。为此,我相信我应该在User和Message实体之间建立多对多的关系。但是,我应该如何映射这种关系以允许用户从收件箱中删除邮件(我以为我会为:DisplayInInbox创建一个布尔值)而不是从其他用户的收件箱中删除它?
我当前的模型不起作用如下:
public class Message
{
public int Id { get; set; }
[MaxLength(150)]
public string Subject { get; set; }
[MaxLength(3000)]
public string Content { get; set; }
public DateTime DateSent { get; set; }
public DateTime? LastViewed { get; set; }
public bool IsRead { get; set; }
public bool DisplayInInbox { get; set; }
public int? ParentId { get; set; }
}
在用户类上我有这个属性:
public virtual ICollection<Message> ReceivedMessages { get; set; }
我需要两个布尔值还是一个足够?我最终应该如何映射这种关系?
更新:
好的,现在这是我的模特:
public class Inbox
{
[Key, Column(Order = 0), ForeignKey("User")]
public int UserId { get; set; }
[Key, Column(Order = 1), ForeignKey("Message")]
public int MessageId { 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 class Message
{
public int Id { get; set; }
[MaxLength(150)]
public string Subject { get; set; }
[MaxLength(3000)]
public string Content { get; set; }
public DateTime DateSent { get; set; }
public int? ParentId { get; set; }
public virtual ICollection<Inbox> ReceivedBy { get; set; }
public virtual ICollection<Inbox> SentBy { get; set; }
}
在User类上:
public virtual ICollection<Inbox> ReceivedMessages { get; set; }
答案 0 :(得分:1)
您不需要任何布尔值。布尔值的含义是您实际通过多对多关系建模的内容。您将在数据库中只有一次消息,并且收件箱的存在将由多对多关系定义。
问题是您希望保留一些与消息和用户相关的其他信息。因此,您必须将联结表公开为单独的实体:
// The message
public class Message
{
public int Id { get; set; }
[MaxLength(150)]
public string Subject { get; set; }
[MaxLength(3000)]
public string Content { get; set; }
public DateTime DateSent { get; set; }
[ForeignKey("ParentMessage")]
public int? ParentId { get; set; }
[ForeignKey("Sender")]
public int SenderId { get; set; }
...
public virtual Message ParentMessage { get; set; }
public virtual ICollection<Inbox> ReceivedBy { get; set; }
public virtual User Sender { get; set; }
}
public class Inbox
{
[Key, Column(Order = 0), ForeignKey("User")]
public int UserId { get; set; }
[Key, Column(Order = 1), ForeignKey("Message")]
public int MessageId { get; set; }
public DateTime? LastViewed { get; set; }
public bool IsRead { get; set; }
public virtual Message Message { get; set; }
public virtual User User { get; set; }
}
public class User
{
public int Id { get; set; }
...
public virtual ICollection<Inbox> ReceivedMessages { get; set; }
public virtual ICollection<Message> SendMessages { get; set; }
}
现在从用户的收件箱中删除邮件只是意味着从ReceivedMessages
删除邮件,但它不会删除邮件 - 它只会删除Inbox
表中的记录。
编辑:
我更新了代码示例以支持您的所有其他要求。现在:
Message
可以有多个接收器Message
由名为Inbox
的单独实体完成,该实体允许您按User
删除邮件,并使用IsRead
每User
个属性。Message
有可选的ParentId
和ParentMessage
,因此您可以跟踪对其他消息的反应/回复。Message
有Sender
和SenderId
,同时User
包含已发送邮件的集合。在我看来,Message
由一个User
发送,因此这种关系与Inbox
无关,必须直接在Message
和User
之间。