Entityframework core 2.0 how to map Many-to-Many without creating a join table

前端 未结 1 1594
春和景丽
春和景丽 2021-01-21 02:58

I am trying this activity to clone from existing .edmx project to code first.

I have two entities. I want to have many to many relation without creating a new table. I

1条回答
  •  花落未央
    2021-01-21 03:32

    As commented on your question, EF Core <= 2.2 does not yet support many-to-many relationships without a join table. This is an issue tracked in the EF Core repo's backlock, and will maybe make it into version 3.0.

    In your case you'll need to introduce a new table that relates to both parent tables. In this case, your model will like something like the following:

    public class WorkCase
    {
        public int WorkCaseId { get; set; }
    
        public int CaseDetailId { get; set; }
    
        public CaseDetail CaseDetail { get; set; }
    
        public ICollection Workflows { get; set; }
    }
    
    public class Workflow
    {
        public int WorkflowId { get; set; }
    
        public string Comment { get; set; }
    
        public DateTime? UpdateDate { get; set; }
    
        public ICollection 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; }
    }
    

    Then in your DbContext subclass, override the OnModelCreating and add the following code:

    protected override void OnModelCreating(ModelBuilder builder)
    {
        var ww = builder.Entity();
        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);
    }
    

    I'm not familiar with your model, but you can move the shared properties to the join table.


    However, there is a great series of articles by @Arthur Vickers (a member in the EF Core dev team) on how to easen up many-to-many relationships:

    • Part 1: The basics
    • Part 2: Hiding as IEnumerable
    • Part 3: Hiding as ICollection
    • Part 4: A more general abstraction

    0 讨论(0)
提交回复
热议问题