Как выполнять запросы к базе данных, используя nhibernate и несколько репозиториев (в окне службы) - PullRequest
1 голос
/ 15 ноября 2011

Я знаю, что этот вопрос задавался много (я думаю), но я не смог найти четкого ответа у самого умного программиста (Google).Я реализовал несколько репозиториев (не общих), но для одного объекта.

public class Person
{
    public string Name { get; set; }
    public int Id { get; set; }
}

public class Product
{
    public int ProductId { get; set; }
}

public class PersonRepository
{
    ISession Session { get; set; }

    public Person GetById(int id) 
    {
        //...  
    }

    public IEnumerable<Person> GetAll()
    { 
        //... 
    }

}

public class ProductRepository
{
    ISession Session { get; set; }


    public Product GetById(int id)
    {
        //...  
    }

    public IEnumerable<Product> GetAll()
    {
        //... 
    }
}

public class PostOfficeService
{
    ProductRepository _rep1 = new ProductRepository();
    PersonRepository _rep2 = new PersonRepository();

    public IEnumerable<Person> GetAllPersonWithSameIdAsProduct()
    {
        _rep1.GetAll().Where( ... )
        // ??? i want it to perform the query in the DB and not two queries in app memory
    }
}

Должен ли я использовать шаблон единицы работы?Есть много данных и информации, но я не могу указать на «правильное» решение или это хорошее решение вообще?

1 Ответ

1 голос
/ 15 ноября 2011

Шаблон «Единица работы» связан с транзакциями - я не понимаю, как он связан с этой проблемой.

GetAllPersonWithSameIdAsProduct должен быть методом одного из ваших PersonRepository - илитретий, более продвинутый, репозиторий - поскольку выше уровня репозитория у вас нет доступа к сеансу.Другой подход - заставить ваши репозитории принимать ICriteria параметры и использовать класс построителя критериев для создания ваших сложных запросов.

Однако использование LINQ-To-NHibernate облегчит решение этих проблем, поскольку реализация IQueryable становится вашейрепозиторий, и ваши классы Service могут выполнять запросы с использованием LINQ, не зная, что они общаются с базой данных.

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