entity-framework-core - Entityframework 核心如何在不创建连接表的情况下映射多对多

标签 entity-framework-core asp.net-core-2.0

我正在尝试通过此事件从现有的 .edmx 项目克隆到代码。

我有两个实体。我想在不创建新表的情况下拥有多对多关系。我正在使用 EF Core 2.0 代码优先方法。

请在我创建的实体下方找到。我不确定这是否是正确的方法。

我想在两个表上都有外键列,即。 WorkCase 和 Workflow 表上的 WorkflowId 和 WorkCaseId。

    public class WorkCase
    {
        [Key]
        public int WorkCaseId { get; set; }

        public int WorkflowId { get; set; }

        public int CaseDetailId {get;set;}

        public CaseDetail CaseDetail {get;set;}

        public WorkFlow WorkFlow { get; set; }

        public ICollection<WorkFlow> WorkFlows { get; set; }
    }

    public class WorkFlow : BaseEntity
    {
        [Key]
        public int WorkFlowId { get; set; }

        public string Comment { get; set; }

        public DateTime? UpdateDate { get; set; }

        public int WorkCaseId { get; set; }

        public WorkCase WorkCase { get; set; }

        public ICollection<WorkCase> WorkCases { get; set; }
    }

我的期望如下。任何人都可以帮助如何实现 EF Core 配置:
- Workcase 将具有最新的工作流 ID
- 工作流将具有每个工作案例 ID 的历史记录。

enter image description here

谢谢

最佳答案

更新 :EF5+ 支持多对多,无需显式映射连接表。见 this EF announcement
正如对您的问题的评论,EF Core <= 2.2 does not yet support many-to-many relationships没有连接表。这是一个 issue在 EF Core 存储库的backlock 中进行了跟踪,并且可能会 make it into version 3.0 .
在您的情况下,您需要引入一个与两个父表相关的新表。在这种情况下,您的模型将类似于以下内容:

public class WorkCase
{
    public int WorkCaseId { get; set; }

    public int CaseDetailId { get; set; }

    public CaseDetail CaseDetail { get; set; }

    public ICollection<WorkCaseWorkflow> Workflows { get; set; }
}

public class Workflow
{
    public int WorkflowId { get; set; }

    public string Comment { get; set; }

    public DateTime? UpdateDate { get; set; }

    public ICollection<WorkCaseWorkflow> WorkCases { get; set; }
}

public class WorkCaseWorkflow
{
    public int WorkCaseId { get; set; }
    public WorkCase WorkCase { get; set; }

    public int WorkflowId { get; set; }
    public Workflow Workflow { get; set; }
}
然后在您的 DbContext子类,覆盖 OnModelCreating并添加以下代码:
protected override void OnModelCreating(ModelBuilder builder)
{
    var ww = builder.Entity<WorkCaseWorkflow>();
    ww.HasKey(w => new { w.WorkCaseId, WorkflowId });
    ww.HasOne(w => w.WorkCase)
      .WithMany(wc => wc.Workflows)
      .HasForeignKey(w => w.WorkCaseId);
    ww.HasOne(w => w.Workflow)
      .WithMany(wc => wc.WorkCases)
      .HasForeignKey(w => w.WorkflowId);
}
我不熟悉您的模型,但您可以将共享属性移动到连接表。

但是,@Arthur Vickers 有很多系列文章(EF Core 开发团队的成员)关于如何缓解多对多关系:
  • Part 1: The basics
  • Part 2: Hiding as IEnumerable
  • Part 3: Hiding as ICollection
  • Part 4: A more general abstraction
  • 关于entity-framework-core - Entityframework 核心如何在不创建连接表的情况下映射多对多,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48173261/

    相关文章:

    asp.net-core - Entity Framework Core 1.0 - 如何播种大量数据

    c# - 没有注册类型 'IServiceProviderFactory[Autofac.ContainerBuilder]' 的服务

    mysql - 通过反射确定泛型 TEntity 的哪些 PropertyInfo 是主键

    c# - ASP .NET Core 2.0 - OpenId Connect 身份验证 : Correlation error

    identityserver3 - asp .net core 2.0中的多种身份验证方案

    c# - svg2png 性能

    c# - 如何在 EF Core 代码首次迁移中进行数据迁移?

    c# - 在 LINQ 查询上使用 "Include"方法时出错

    c# - 无法获取 DbContext 的反射类型

    c# - 在自定义验证属性中使用数据库上下文