实体框架一对多自我引用关系

时间:2016-04-08 17:28:47

标签: c# entity-framework asp.net-web-api code-first

这是我的应用程序模型:

public class Email
{
    public int Id {get; set;}

    public string Content {get; set;}

    public string Address {get; set;}
}

我想添加选项以响应电子邮件(电子邮件链 - 响应)应该是这样的吗?:

public class Email
{
    public int Id {get; set;}

    public string Content {get; set;}

    public string Address {get; set;}

    public int? PreviousEmailId {get; set;}

    public virtual Email PreviousEmail {get; set;}

    public virtual List<Email> Responses {get; set;}
}

回复电子邮件可以是对其他电子邮件的回复等等......就像电子邮件应用程序一样

我希望能够收到一封电子邮件,并将其作为连锁店引用的所有电子邮件显示给我的客户。 就像在真正的电子邮件应用程序中一样,当删除电子邮件时,也应该删除所有链。

任何人都可以告诉我应该如何定义模型(我首先使用EF 6代码)。我该如何定义关系? 什么是最佳做法?

我希望它足够清楚,它与其他电子邮件应用程序的工作方式类似。

谢谢!

1 个答案:

答案 0 :(得分:0)

您可以通过两种方式解决此问题

第一个解决方案:与您提出的相同,称为递归关系&#34;自我关系&#34;,以存储对父电子邮件&#34;以前的电子邮件&#34;在你的情况下如下:

public class Email
{
     public int Id {get; set;}
     public int? PrevousEmailId {get; set;}
     // other properties

     public virtual Email PreviousEmail{get;set;}
}

第二个解决方案:将关系存储在一个单独的表中,例如,它允许您同时响应多个收件人,并且它是递归关系或图关系的一般解决方案,如下所示:

public class Email
{
     public int Id {get; set;}
     // other properties
}

public class EmailResponse
{
     public int EmailId {get; set;}
     public int PreviousEmailId {get; set;}

     public virtual Email Email {get; set;}
     public virtual Email PreviousEmail {get; set;}
}

我希望这会对你有所帮助