Entity Framework Fluent API - сопоставляет отношения «многие ко многим» и запрашивает их - PullRequest
0 голосов
/ 10 июня 2019

После подробного прочтения в этой темы я захотел реализовать множество собственных отношений «многие-многие». Вот мой использованный случай:

enter image description here

К вашему сведению: хотя между Program и Provider, Program.ProvID и Provider.ProvID не существует взаимосвязи FK, они действуют как столбцы взаимосвязей

В моем DAL у меня есть следующие модели:

public class Patient
    {
        public Patient()
        {
            Programs = new HashSet<Program>();
        }
        public virtual ICollection<Program> Programs { get; set; }
}

public class Program
    {
        public Program()
        {
            Patients = new HashSet<Patient>();
            Organization = new HashSet<Organization>();
        }

        public int ProgramId { get; set; }
        public string Name { get; set; }
        public string SiteName { get; set; }
        public int ProviderId { get; set; }
        public virtual ICollection<Patient> Patients { get; set; }
        public virtual ICollection<Organization> Organization { get; set; }
    }

public class Organization
{
    public Organization()
    {
        Programs = new HashSet<Program>();
    }

    public int OrgID { get; set; }
    public string Name { get; set; }
    public virtual ICollection<Program> Programs { get; set; }
}

В моем AppContext я сопоставил эти модели следующим образом:

modelBuilder.Entity<Organization>().ToTable("Organization").HasKey(x => x.OrgID);    
            modelBuilder.Entity<Patient>().ToTable("Patient").HasKey(x => x.PatientID);                
            modelBuilder.Entity<Program>().ToTable("Program").HasKey(p => p.ProgramId);
            modelBuilder.Entity<Program>().ToTable("Program").Property(p => p.ProviderId).HasColumnName("ProvID");                
            modelBuilder.Entity<Program>()
                .HasMany(p => p.Patients)
                .WithMany(p => p.Programs)
                .Map(pp =>
                {
                    pp.MapLeftKey("ProgID");
                    pp.MapRightKey("PatientID");
                    pp.ToTable("PatProg");
                });
            modelBuilder.Entity<Organization>()
                .HasMany(o => o.Programs)
                .WithMany(p => p.Organization)
                .Map(prov =>
                {
                    prov.MapLeftKey("OrgID");
                    prov.MapRightKey("ProvID");
                    prov.ToTable("Provider");
                });

Теперь я хочу выбрать ALL из Patient s, которые находятся в Organization.

return Context.Set<Organization>().AsNoTracking().Where(o => o.OrgID == organizationId)
                .SelectMany(o => o.Programs)
                .SelectMany(p => p.Patients)

Однако это возвращает 0. Более того, когда я запускаю профилировщик во время выполнения, выходной запрос НЕ похож на то, что я отобразил.

SELECT 
    [Join1].[PatientID1] AS [PatientID], 
    [Join1].[FirstName] AS [FirstName], 
    [Join1].[LastName] AS [LastName], 
    [Join1].[SSN#] AS [SSN#], 
    [Join1].[Suffix] AS [Suffix]
    FROM  
        [dbo].[Provider] AS [Extent1]
        INNER JOIN  (
                        SELECT 
                            [Extent2].[ProgID] AS [ProgID], 
                            [Extent3].[PatientID] AS [PatientID1], 
                            [Extent3].[FirstName] AS [FirstName], 
                            [Extent3].[LastName] AS [LastName], 
                            [Extent3].[SSN#] AS [SSN#], 
                            [Extent3].[Suffix] AS [Suffix]
                        FROM
                            [dbo].[PatProg] AS [Extent2] 
                            INNER JOIN [dbo].[Patient] AS [Extent3] ON [Extent2].[PatientID] = [Extent3].[PatientID] ) AS [Join1] ON [Extent1].[ProvID] = [Join1].[ProgID]
    WHERE [Extent1].[OrgID] = 111

Я действительно не уверен, что я здесь делаю неправильно.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...