entity-framework - Entity Framework Core 3.0 同一张表的多对多
问题描述
我正在使用 ef core 3.0 代码优先数据库。我有一个表,Status
我需要创建与自身的关系以列出可能的“下一个状态” List<Status> SubsequentStatuses
。这当然是为了系统地控制对象的工作流程。
从表面上看,它会在表中创建一个一对多的关系和一个新的 StatusId 列;但是,我需要能够将状态设置为多个状态的“SubsequentStatus”。
例如,如果有 4 个状态:
- 新的
- 工作中
- 完全的
- 取消
我想要以下
- 新的
- 后续状态
- 工作中
- 取消
- 后续状态
- 工作中
- 后续状态
- 完全的
- 取消
- 后续状态
- 完全的
- 没有任何
- 取消
- 没有任何
请注意,“已取消”与“新”和“工作中”相关
这是我此时拥有的类和配置:
public class EstimateStatus
{
public int Id { get; set; }
public string Name { get; set; }
public virtual ICollection<EstimateStatusRel> SubsequentStatuses { get; set; }
}
public class EstimateStatusRel
{
public int EstimateStatusId { get; set; }
public EstimateStatus EstimateStatus { get; set; }
public int SubsequentStatusId { get; set; }
public EstimateStatus SubsequentStatus { get; set; }
}
public class SapphireContext : DbContext
{
protected override void OnModelCreating(ModelBuilder modelBuilder)
{
modelBuilder.Entity<EstimateStatusRel>().HasKey(x => new { x.EstimateStatusId, x.SubsequentStatusId });
modelBuilder.Entity<StatusRel>()
.HasOne(pt => pt.Status)
.WithMany(p => p.SubsequentStatuses)
.HasForeignKey(pt => pt.StatusId);
}
}
这造成的问题是,当 Entity Framework 构建迁移时,它会出错关于多个级联删除操作,但是当我将NoAction
修饰符添加到 modelBuilder fluent API 时,它仍然没有清除错误
解决方案
它最终是因为我没有指定一个OnDelete
动作
这是我的最终配置:
modelBuilder.Entity<EstimateStatusRel>()
.HasOne(pt => pt.Status)
.WithMany(p => p.SubsequentStatus)
.HasForeignKey(pt => pt.EstimateStatusId)
.OnDelete(DeleteBehavior.NoAction);
推荐阅读
- java - 如何在构建期间检查类中的 Java 方法引用(双冒号)运算符用法
- asp.net - HTTP 错误 400。请求标头的大小太长 - Chrome
- firebase - 如何覆盖我的主要 pubspec 依赖项(对颤振应用程序进行白标)
- graphql - Facebook 在创建广告视频时是否从 `file_url` 参数中指定的 url 下载视频?
- javascript - 所有 iframe 内容和 CDN 不再工作
- haskell - 具有可选返回值的 Haskell 函数
- spring-boot - Keycloak 登录页面未显示,我改为获取 Spring Security 登录
- python - python 中的 mpi4py 通信器是什么类型的?
- node.js - CloudRun Express 应用程序 - 在 SyntaxError 上向 GCP 错误报告报告自定义消息
- node.js - 量角器:10000 毫秒后无法连接到运行时进程超时 - (原因无法连接到目标:连接 ECONNREFUSED 127.0.0.1:1904)