2016-04-30 6 views
0

Я пытаюсь проверить мои тестовые инструменты с образцом кода ниже:Слишком много результатов, когда хотят выборки данных с помощью NHibernate

public void Test_tools() 
{ 
    // Arrange 
    DateTime appointmentDate = DateTime.Now;  
    DateTime appointmentDate2 = DateTime.Now - TimeSpan.FromDays(5); 
    DateTime appointmentDate3 = DateTime.Now - TimeSpan.FromDays(10); 

    string firstName = "Frank"; 
    string lastName = "Carter"; 

    DatabaseTools.AddPatientToDatabase(firstName, lastName, 
      appointmentDate, appointmentDate2, appointmentDate3); 

    var patients = DatabaseTools.GetPatientFromDatabase(firstName, lastName); 
} 

В первом я добавляю PatientEntity с 3 AppointmentEntity классы в базе данных (AddPatientToDatabase метод):

public static void AddPatientToDatabase(string firstName, 
     string lastName, params DateTime[] appointmentDate) 
{ 
    PatientEntity patient = new PatientEntity 
    { 
     FirstName = firstName, 
     LastName = lastName 
    }; 

    foreach (DateTime item in appointmentDate) 
    { 
     var appointment = new AppointmentEntity 
     { 
      Date = item 
     }; 
     patient.AddAppointment(appointment); 
    } 

    ISessionFactory sessionForTests = 
       NHibernateConfig.CreateSessionFactory(Database.TEST_DB_NAME); 

    using (ISession session = sessionForTests.OpenSession()) 
    { 
     using (ITransaction transaction = session.BeginTransaction()) 
     { 
      session.SaveOrUpdate(patient); 
      transaction.Commit(); 
     } 
    } 
} 

Следующая Я пытаюсь получить PatientEnt итй из базы данных, используя условие FirstName и LastName, используя метод GetPatientFromDatabase, который выглядит следующим образом:

public static IList<PatientEntity> GetPatientFromDatabase(string firstName, string lastName) 
{ 
    ISessionFactory sessionForTests = 
      NHibernateConfig.CreateSessionFactory(Database.TEST_DB_NAME); 

    using (ISession session = sessionForTests.OpenSession()) 
    { 
     return session.QueryOver<PatientEntity>() 
       .Where(k => k.FirstName == firstName && k.LastName == lastName) 
       .Fetch(x => x.Appointments).Eager.List(); 
    } 
} 

Проблема заключается в том, что я получаю столько PatientEntity классов, как AppointmentEntity классов были addes (вместо одного). В каждом из 3 результатов пациент совпадает с тем же идентификатором и набором назначений. Какова моя ошибка в запросе, который я задал? Я использую базу данных PostgreSQL, где (используя pgAdmin), я вижу, что все настроено правильно. Вопрос в том, как я должен запросить, чтобы получить только один PatientEntity с тремя AppointmentEntity классы в его Назначения коллекция.

EDIT:

Я также попытался использовать CreateCriteria, но как только я поставил нетерпеливый выборку списка назначений, я получаю 3 же пациентов вместо 1. Является ли возможно, ошибка в коллекции нетерпеливого назначений инициализация?

public static IList<PatientEntity> GetPatientFromDatabase(string firstName, string lastName) 
{ 
    ISessionFactory sessionForTests = NHibernateConfig.CreateSessionFactory(Database.TEST_DB_NAME); 
    using (ISession session = sessionForTests.OpenSession()) 
    { 
     return session.CreateCriteria<PatientEntity>() 
      .Add(Expression.Eq("FirstName", firstName)) 
      .Add(Expression.Eq("LastName", lastName)) 
      .SetFetchMode("Appointments", FetchMode.Eager) 
      .List<PatientEntity>(); 
    } 
} 
+0

Похоже, что пациент имеет 3 назначения или у вас более одного пациента с тем же именем и фамилией (или и тем, и другим). – jdweng

+0

@jdweng Спасибо за ответ. Я прояснил свою проблему. База данных сбрасывается перед тестом, поэтому есть только то, что добавлено в тесте - один пациент с тремя встречами. Моя проблема в том, почему (когда я спрашиваю по имени и фамилии), я получаю столько результатов от пациентов, сколько назначений (пациент одинаково в каждой записи). – mikes

+0

Почему вы придумываете приманки? .Fetch (x => x.Appointments) – jdweng

ответ

0

С помощью @jdweng я смог придумать другой запрос, который позволяет мне получить инициализированную коллекцию назначений без дубликатов в списке пациентов:

public static IList<PatientEntity> GetPatientFromDatabase(string firstName, 
        string lastName) 
    { 
     ISessionFactory sessionForTests = 
       NHibernateConfig.CreateSessionFactory(Database.TEST_DB_NAME); 

     using (ISession session = sessionForTests.OpenSession()) 
     { 
      return session.QueryOver<PatientEntity>() 
       .Where(k => k.FirstName == firstName && k.LastName == lastName) 
       .Fetch(x => x.Appointments).Eager 
       .TransformUsing(Transformers.DistinctRootEntity).List(); 
     } 
    } 
Смежные вопросы