Могу ли я сохранить контекст Entity Framework как переменную класса? - PullRequest
0 голосов
/ 16 мая 2018

Я привык работать с соединениями с базой данных, где вы подключаетесь / открываете / закрываете как можно быстрее в каждом методе.Сейчас я работаю с Entity Framework, и поэтому все мои методы делают такие вещи:

using (var context = new FooEntities()) {
    // linq to sql query here
}

Мне сказали, что с Entity Framework я могу фактически сделать эту переменную context классом.переменная уровня и не нужно создавать его экземпляр в каждом методе.Это действительно так, или я должен продолжать этот шаблон в каждом методе?

Я использую версию 5.0.0 фреймворка, если это имеет значение.

Ответы [ 2 ]

0 голосов
/ 05 июля 2018

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

Для меня лично я создаю контекст как можно ближе и убиваю его как можно скорее.Таким образом, вызовы Get должны использовать AsNoTracking (), чтобы значительно ускорить вызовы, если вам не нужно пытаться обновить их позже.Вы также можете создать DbContextFactory, чтобы каждый класс мог контролировать это взаимодействие по своему усмотрению.(т. е. метод A всегда создает новый, но методы B и C могут делиться, если один из них вызывается первым).Хотя это может привести к собственным проблемам в будущем, но тогда вы можете выбрать эти условия.

0 голосов
/ 16 мая 2018

Вы можете иметь Context как свойство класса, но вы должны подумать, как управлять удалением Context. Например:

public class UnitOfWork:IDisposable
{
    public DbContext Context { get; set; }


    public UnitOfWork()
    {
        Context = null; //initialize context here
    }

    public void DoWorkWithContext1()
    {
        //anything you need
    }

    public void DoWorkWithContext2()
    {
        //anything you need
    }

    public void Dispose()
    {
        if (Context != null)
            Context.Dispose();
    }
}

Тогда вы будете использовать класс следующим образом:

     using (var unit= new UnitOfWork())
        {
            unit.DoWorkWithContext1();
            unit.DoWorkWithContext2();
        }
...