Entity конструкторы - Entity Framework - PullRequest
1 голос
/ 04 марта 2009

Я пытаюсь найти лучший способ работы с объектами в рамках структуры. Я не хочу, чтобы мои формы знали что-либо о ObjectContext, поэтому я помещаю всю логику в сущности (я пишу частичные классы). Я много искал других, и нигде не нашел такого подхода. Итак, как ты работаешь? Как вы получаете объект из ObjectContext и работаете с ним, не теряя его состояния сущностей и все остальное? Я пришел к какому-то решению, но все еще интересуюсь другими. Спасибо.

Ответы [ 2 ]

3 голосов
/ 04 марта 2009

Следуя DDD, давайте отделим ваши сущности от логики, которая на них действует. Лично я использовал шаблон Repository для создания одного универсального репозитория, а также некоторых специализированных репозиториев, которые работают с моими сущностями. Хранилище может работать с заданным конструктором ObjectContext или создаст новый (из конфигурации), если ничего не указано.

Мой пример интерфейса IRepository:

public interface IRepository<T> where T : class
{
    /// <summary>
    /// Return all instances of type T.
    /// </summary>
    /// <returns></returns>
    IQueryable<T> All();

    /// <summary>
    /// Return all instances of type T that match the expression exp.
    /// </summary>
    /// <param name="exp"></param>
    /// <returns></returns>
    IEnumerable<T> Find(Func<T, bool> exp);

    /// <summary>Returns the single entity matching the expression. 
    /// Throws an exception if there is not exactly one such entity.</summary>
    /// <param name="exp"></param><returns></returns>
    T Single(Func<T, bool> exp);

    /// <summary>Returns the first element satisfying the condition.</summary>
    /// <param name="exp"></param><returns></returns>
    T First(Func<T, bool> exp);

    /// <summary>
    /// Mark an entity to be deleted when the context is saved.
    /// </summary>
    /// <param name="entity"></param>
    void Delete(T entity);

    /// <summary>
    /// Create a new instance of type T.
    /// </summary>
    /// <returns></returns>
    T CreateInstance();

    /// <summary>Persist the data context.</summary>
    void SaveAll();
}
2 голосов
/ 18 июня 2010

Примеры того, как поместить структуру сущностей 4 в n-уровневую архитектуру в порядке сложности:

  1. http://devtalk.dk/2009/06/09/Entity+Framework+40+Beta+1+POCO+ObjectSet+Repository+And+UnitOfWork.aspx
  2. http://blog.keithpatton.com/2009/05/30/Entity+Framework+POCO+Repository+Using+Visual+Studio+2010+Net+40+Beta+1.aspx
  3. http://danielwertheim.files.wordpress.com/2009/12/putting-entity-framework-4-to-use-in-a-business-architecture-v2.pdf
  4. http://www.simonsegal.net/blog/2010/01/11/entity-framework-repositories-fetching-strategies-specification-and-mapping-using-nfetchspec-for-role-driven-development-parts-1-4

Кстати, если вы хотите реализовать интерфейс, размещенный @twk, используйте синтаксис IEnumerable<T> Find(Expression<Func<T, bool>> exp); для всех операций запроса. Реализация IEnumerable<T> Find(Func<T, bool> exp); приведет к материализации всей таблицы и фильтрации в памяти.

...