首页 > 解决方案 > Entity Framework Core - 3 层关系

问题描述

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

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

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; }
}

我将如何使用 Fluent API 配置这种关系,以便用户和邮件之间存在多对多关系,并且邮件可以有 2 个外键返回到 UserFrom 和 UserTo?

对此的任何帮助将不胜感激。

标签: entity-framework-coremany-to-many

解决方案


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

public class User
{
    public int Id { get; set; }
    public string Name { get; set; }

    public ICollection<Mail> ReceivedMails { get; set; }
    public ICollection<Mail> SentMails { get; set; }
}

public class Mail
{
    public int Id { get; set; }
    public string Title { get; set; }
    public string Body { get; set; }

    public int SenderId { get; set; }
    public User Sender { get; set; }

    public int RecipientId { get; set; }
    public User Recipient { get; set; }
}

您可以将它们配置为 -

protected override void OnModelCreating(ModelBuilder builder)
{
    builder.Entity<Mail>()
        .HasOne(p => p.Sender)
        .WithMany(p => p.SentMails)
        .HasForeignKey(p => p.SenderId)
        .OnDelete(DeleteBehavior.NoAction);

    builder.Entity<Mail>()
        .HasOne(p => p.Recipient)
        .WithMany(p => p.ReceivedMails)
        .HasForeignKey(p => p.RecipientId)
        .OnDelete(DeleteBehavior.NoAction);
}

推荐阅读