entity-framework-core - 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?
对此的任何帮助将不胜感激。
解决方案
如果您尝试对邮件与其发件人/收件人之间的关系进行建模,那么您的加入实体中不需要多对多关系或 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);
}
推荐阅读
- editor - 在 VS Code 中自定义带引号的字符串
- azure-functions - 如何通过 Azure Functions 应用在 Azure Linux VM 上执行 bash 脚本
- php - 为什么foreach输出两倍的结果
- oracle - Oracle 12.1 在 NVL 和左外连接上的性能
- python - 当时间戳高于同一组中具有值的行时,删除组中的行
- javascript - 比较对象键/值对中没有标准键的两个数组,将缺失值推送到javascript中的第一个数组
- java - 尝试仅使用嵌套的 for 循环(Java)在侧面打印带有线条的数量不断增加的金字塔
- kotlin - 使用 ktor 检查多部分请求正文中是否存在所有参数
- python - 烧瓶找不到404的修复程序吗?
- git - git 合并请求仅功能分支提交