Entity framework core 实体框架核心-三层关系

Entity framework core 实体框架核心-三层关系,entity-framework-core,many-to-many,Entity Framework Core,Many To Many,我必须应用一组与包含消息传递系统的系统的关系 我有两个域对象和一个映射对象(对于多对多关系): 公共类用户 { 公共用户() { UserMails=新列表(); } 公共int Id{get;set;} 公共ICollection用户邮件{get;set;} } 公营邮件 { 公共邮件() { UserMails=新列表(); } 公共int Id{get;set;} 公共字符串标题{get;set;} 公共字符串体{get;set;} 公共ICollection用户邮件{get;set;}

我必须应用一组与包含消息传递系统的系统的关系

我有两个域对象和一个映射对象(对于多对多关系):

公共类用户
{
公共用户()
{
UserMails=新列表();
}
公共int Id{get;set;}
公共ICollection用户邮件{get;set;}
}
公营邮件
{
公共邮件()
{
UserMails=新列表();
}
公共int Id{get;set;}
公共字符串标题{get;set;}
公共字符串体{get;set;}
公共ICollection用户邮件{get;set;}
}
公共类用户邮件
{
公共int Id{get;set;}
public int FromUserId{get;set;}
公共用户FromUser{get;set;}
公共int ToUserId{get;set;}
公共用户ToUser{get;set;}
public int MailId{get;set;}
公共邮件{get;set;}
}
如何使用Fluent API配置这种关系,以便用户和邮件之间存在多对多关系,邮件可以有两个外键返回到UserFrom和UserTo


非常感谢您在这方面提供的任何帮助。

如果您试图建立邮件与其发件人/收件人之间的关系模型,那么您不需要多对多关系,也不需要加入实体中的两个外键。相反,您需要2个一对多关系,如下所示-

公共类用户
{
公共int Id{get;set;}
公共字符串名称{get;set;}
公共ICollection ReceivedMails{get;set;}
公共ICollection SentMails{get;set;}
}
公营邮件
{
公共int Id{get;set;}
公共字符串标题{get;set;}
公共字符串体{get;set;}
public int SenderId{get;set;}
公共用户发送方{get;set;}
公共int RecipientId{get;set;}
公共用户收件人{get;set;}
}
您可以将它们配置为-

模型创建时受保护的覆盖无效(ModelBuilder)
{
builder.Entity()
.HasOne(p=>p.Sender)
.WithMany(p=>p.SentMails)
.HasForeignKey(p=>p.SenderId)
.OnDelete(DeleteBehavior.NoAction);
builder.Entity()
.HasOne(p=>p.Recipient)
.WithMany(p=>p.ReceivedMails)
.HasForeignKey(p=>p.RecipientId)
.OnDelete(DeleteBehavior.NoAction);
}

我开始想,也许这不需要三层关系。也许我只需要邮件和用户类什么是三层关系?谢谢,我最终使用了这个解决方案,而不需要映射模型。
public class User
{

    public User()
    {
        UserMails = new List<UserMail>();
    }

    public int Id { get; set; }
    public ICollection<UserMail> UserMails { get; set; }
}

public class Mail
{
    public Mail()
    {
        UserMails = new List<UserMail>();
    }

    public int Id { get; set; }
    public string Title { get; set; }
    public string Body { get; set; }
    public ICollection<UserMail> UserMails { get; set; }
}

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

    public int FromUserId { get; set; }
    public User FromUser { get; set; }

    public int ToUserId { get; set; }
    public User ToUser { get; set; }

    public int MailId { get; set; }
    public Mail Mail { get; set; }
}