André Luiz
André Luiz

Reputation: 7302

Many to many in database but 1-to-1 in entity framework

I started working on an ongoing project and it has a many-to-many relationship in the database and in some parts of the code too, but I realized that even the relationship being many-to-many in the model there is always only one line linking the two entities (confirmed with the author). This is what I mean: The two entities are task and task list and a task only belongs to a task list. Models below:

public class ProjectTask 
{
     public long Id { get; set; }     
    // other non related properties
}

public class ProjectTaskList
{
     public long Id { get; set; }    
     public DateTime? DateEnd { get; set; } 
     // other non related properties
}

// link between task list and task
public class ProjectTaskListTask
{
    public long ProjectTaskId { get; set; }
    public ProjectTask ProjectTask { get; set; }
    public long ProjectTaskListId { get; set; }
    public ProjectTaskList ProjectTaskList { get; set; }
    public int Order { get; set; }
}

And its configuration in the OnModelCreating method of the context class:

        modelBuilder.Entity<ProjectTaskListTask>()
            .HasKey(a => new { a.ProjectTaskId, a.ProjectTaskListId });

        modelBuilder.Entity<ProjectTaskListTask>()
        .HasOne(u => u.ProjectTaskList)
        .WithMany(u => u.Tasks)
        .IsRequired()
        .OnDelete(DeleteBehavior.Restrict);

My problem is: In some parts of my code I need to know the Task List of a task, I need to use it in Where queries to do some validations, like : Tasks.Where(p => p.TaskList.DateEnd == null).

How can I add a Not Mapped property to the ProjectTask entity so I could do that? I'm using Entity Framework Core 2.

Thanks for any help

Upvotes: 0

Views: 56

Answers (1)

Steven Peirce
Steven Peirce

Reputation: 546

Without changing the underlying data structure, could you query ProjectTaskListTask? Something along the lines...? ProjectTaskListTask .Include(p => p.ProjectTaskList) .Include(p => p.ProjectTask) .Where(p => p.ProjectTaskList.DateEnd == null) .Select(p => p.ProjectTask);

Upvotes: 1

Related Questions