Я пытаюсь проверить мои тестовые инструменты с образцом кода ниже:Слишком много результатов, когда хотят выборки данных с помощью 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>();
}
}
Похоже, что пациент имеет 3 назначения или у вас более одного пациента с тем же именем и фамилией (или и тем, и другим). – jdweng
@jdweng Спасибо за ответ. Я прояснил свою проблему. База данных сбрасывается перед тестом, поэтому есть только то, что добавлено в тесте - один пациент с тремя встречами. Моя проблема в том, почему (когда я спрашиваю по имени и фамилии), я получаю столько результатов от пациентов, сколько назначений (пациент одинаково в каждой записи). – mikes
Почему вы придумываете приманки? .Fetch (x => x.Appointments) – jdweng