EF4.1多对多关系:每个用户的DisplayInInbox

时间:2011-04-29 20:01:26

标签: entity-framework entity-framework-4 many-to-many entity-relationship

出于某种原因,我无法理解这一点...我有一个私人消息系统,允许用户发送彼此的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; }

1 个答案:

答案 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删除邮件,并使用IsReadUser个属性。
  • Message有可选的ParentIdParentMessage,因此您可以跟踪对其他消息的反应/回复。
  • MessageSenderSenderId,同时User包含已发送邮件的集合。在我看来,Message由一个User发送,因此这种关系与Inbox无关,必须直接在MessageUser之间。