Подтвердить что ты не робот

Какова единица работы в EF?

Я изучаю EF и видел много примеров, и во время учебы я узнал об использовании репозитория и единицы шаблонов работы. Я понял, почему использовать репозиторий, но у меня нет понимания единицы работы на самом деле.

Отсутствие понимания затрудняет понимание DAL. Пожалуйста, помогите мне.

Спасибо

4b9b3361

Ответ 1

DataContext или ObjectContext - это единица работы.

Таким образом, ваш DAL будет сохранять, удалять и извлекать объекты, а ваш DataContext/ObjectContext будет отслеживать ваши объекты, управлять транзакциями и применять изменения.

Это пример , чтобы проиллюстрировать идею решения.

using(var context = new ObjectContext()) { // Unit of Work
    var repo = new ProductRepository(context);
    var product = repo.GetXXXXXXX(...);
    ...

    // Do whatever tracking you want to do with the object context. For instance:
    // if( error == false) { 
    //     context.DetectChanges();
    //     context.SaveChanges(SaveOptions.AcceptAllChangesAfterSave);
    // }
}

И ваш репозиторий будет выглядеть так:

public abstract class Repository {

    public Respository(ObjectContext context){
        CurrentContext = context;
    }

    protected ObjectContext CurrentContext { get; private set; } 
}

public class ProductRespository : Repository {
    public ProductRespository(ObjectContext context) : base(context){
    }

    public Product GetXXXXXX(...){
        return CurrentContext... ; //Do something with the context
    }
}    

Другой способ - поместить единицу работы (контекст объекта) глобально:

Вам нужно определить, какова будет ваша единица работы. В этом примере это будет веб-запрос. В реализации реального мира я бы использовал для этого инъекцию зависимостей.

public static class ContextProvider {

    public static ObjectContext CurrentContext {
        get { return HttpContext.Items["CurrentObjectContext"];
    }

    public static void OpenNew(){
        var context = new ObjectContext();
        HttpContext.Items["CurrentObjectContext"] = context; 
    }

    public static void CloseCurrent(){
        var context = CurrentContext;
        HttpContext.Items["CurrentObjectContext"] = null;
        // Do whatever tracking you want to do with the object context. For instance:
        // if( error == false) { 
        //     context.DetectChanges();
        //     context.SaveChanges(SaveOptions.AcceptAllChangesAfterSave);
        // }
        context.Dispose();
    }
}

В этом примере ObjectContext является единицей работы и будет жить в текущем запросе. В своем глобальном asax вы можете добавить:

protected void Application_BeginRequest(object sender, EventArgs e){
    ContextProvider.OpenNew();
}

protected void Application_EndRequest(object sender, EventArgs e){
    ContextProvider.CloseCurrent();
}

В ваших репозиториях вы просто вызываете ContextProvider.CurrentContext

Ответ 2

Одним из наиболее распространенных шаблонов проектирования при разработке корпоративного программного обеспечения является Единица работы. По словам Мартина Фаулера, Unit of Work pattern поддерживает список объектов, на которые влияет бизнес-транзакция, и координирует запись изменений и разрешение проблем concurrency.

Шаблон "Единица работы" не обязательно означает, что вы явно создадите себя, но шаблон отображается почти в любом инструменте сохранения, о котором я знаю. Интерфейс ITransaction в NHibernate, класс DataContext в LINQ to SQL и класс ObjectContext в Entity Framework являются примерами единицы работы. В этом случае почтенный DataSet может использоваться как единица работы.

Для получения более подробной информации, пожалуйста, нажмите здесь, чтобы прочитать эту статью, она хорошая.

В учебном пособии по внедрению репозитория и шаблонов рабочих единиц в приложении ASP.NET MVC (MVC 4 и EF 5) (9 из 10) нажмите здесь

Для учебников EF 6 и MVC 5 нажмите здесь

Надеюсь, это поможет, это помогло мне!

enter image description here

Ответ 3

Единица работы

Поддерживает список объектов, подверженных бизнес-транзакции, и координирует запись из-за изменений и разрешения проблем concurrency.

enter image description here

Когда вы извлекаете данные из базы данных и из нее, важно следить за тем, что вы изменили; в противном случае эти данные не будут записанный обратно в базу данных. Аналогичным образом вы должны вставить новые объекты, которые вы создаете и удаляете любые объекты, которые вы удаляете.

Вы можете изменить базу данных с каждым изменением на свою объектную модель, но это может привести к множеству очень маленьких запросов к базе данных, которые заканчиваются очень медленно. Кроме того, для этого требуется, чтобы у вас была транзакция открытый для всего взаимодействия, что нецелесообразно, если у вас есть бизнес-транзакция, которая охватывает несколько запросов. Ситуация еще хуже, если вам нужно отслеживать объекты, которые вы читали, чтобы вы может избежать непоследовательных чтений.

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

http://martinfowler.com/eaaCatalog/unitOfWork.html