Шаблон импорта и репозитория функций с Entity Framework 4.0 - PullRequest
1 голос
/ 29 июня 2010

Может кто-нибудь посоветовать мне, как они реализовали использование импорта функций при использовании шаблона Repository против EF 4.0?

У нас есть таблица, сопоставленная с объектом-кандидатом, а также функция импорта из существующего спрока, который отображается на кандидата. Это отлично работает в EF, но мы абстрагируем с помощью репозиториев, которые принимают своим конструктором IObjectSet, где T - сущность POCO. Однако это означает, что я не могу получить ссылку на функцию импорта. Единственный способ сделать это - передать ссылку на ObjectContext репозиториям, которые в этом нуждаются, но для меня это похоже на запах дизайна.

Несмотря на то, что некоторые из наших репозиториев расширены за счет пользовательских интерфейсов, мы все еще сталкиваемся с той же проблемой.

    public class CandidateRepository : Repository<Candidate>, ICandidateRepository
{
    public CandidateRepository(IObjectSet<Candidate> entities)
        : base(entities)
    {
    }

    public Candidate GetByEmail(string email)
    {
        return Entities.SingleOrDefault(c => c.EmailAddress.Equals(email));
    }

    public bool CandidateExists(string candidateNumber)
    {
        return Entities.SingleOrDefault(c => c.Number.Equals(candidateNumber)) != null;
    }

    public Candidate GetByNumber(string number)
    {
        return Entities.SingleOrDefault(c => c.Number.Equals(number));
    }

    public Candidate GetMember(string number)
    {

        return new Candidate();  //This one needs to return from the Function Import
    }
}

Любой совет с благодарностью.

Ответы [ 2 ]

1 голос
/ 29 июня 2010

Чтобы решить вашу проблему напрямую, вы можете привести entities к ObjectSet<T> и использовать свойство entites.Context для получения ObjectContext.

public Candidate GetMember(string number)
{
    var objectSet = Enities as ObjectSet<Candidate>;

    if(objectSet == null) throw new Exception("Oh, it's not EF IObjectSet implementation");        

    return objectSet.Context.MyCustomFunction(string number);
}

Как видите, этот код опирается на конкретную реализацию IObjectSet, которая совсем не годится.

Лучшая идея - создавать репозитории только для агрегированных корней, а не для каждой таблицы. Так что будет более естественно передать ObjectContext в репозиторий ctor.

0 голосов
/ 09 июля 2010

Я пошел по этому пути и почувствовал, что при передаче интерфейса ObjectContext в ваш репозиторий становится меньше боли Реализация интерфейса должна иметь некоторый способ вызова функции. Поэтому, когда вы переходите к конкретной реализации ObjectContext, все должно работать нормально.

...