EntityFramework DbContext в статическом методе для запроса - PullRequest
0 голосов
/ 23 февраля 2019

Как Entity Framework DbContext работает в статическом методе для каждого веб-запроса?есть ли проблемы с производительностью?У меня есть 2 класса ниже.Какой из них лучше использовать?или плохо?Нужно ли нам получить экземпляр всей груши?есть ли проблема?

public class MyClassA 
{
    public static Product GetProduct(int Id) 
    {
        using(MyContext myContext = new MyContext())
        return myContext.Products.Where(x = > x.Id == Id).SingleOrDefault();
    }
}

public class MyClassB 
{
    MyContext myContext = new MyContext()

    public static Product GetProduct(int Id) 
    {
        return myContext.Products.Where(x = > x.Id == Id).SingleOrDefault();
    }
}

Позвоните в контроллер

public class DefaultController : ControllerBase
{
    public Product GetProductStaticMethodinMyClassA(int Id)
    {
        return MyClassA.GetProduct(Id);
    }

    public Product GetProductStaticMethodinMyClassB(int Id)
    {
        return MyClassB.GetProduct(Id);
    }


    public Product GetProductinRequlurUse(int Id)
    {
        MyContext myContext = new MyContext();

        return myContext.Products.Where(x => x.Id == Id).SingleOrDefault();

    }
}

1 Ответ

0 голосов
/ 24 февраля 2019

Вам нужно создать один DbContext для HTTP-запроса ... т.е. не использовать один и тот же DbContext для нескольких запросов.

C # Сборщик мусора автоматически удалит DbContext, как только он выйдет из области видимости.так что вам не нужно помещать его в using блок, но, сказав, что большинство людей используют using блок, а MS, кажется, поощряет его :

Время жизни контекста начинается, когда создается экземпляр, и заканчивается, когда экземпляр удаляется или собирается.Используйте using, если вы хотите, чтобы все ресурсы, которыми управляет контекст, располагались в конце блока.Когда вы используете using, компилятор автоматически создает блок try / finally и вызывает dispose в блоке finally.

public void UseProducts()
{
    using (var context = new ProductContext())
    {     
        // Perform data access using the context
    }
}

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

Если вы хотите использовать DbContext внутри вашего контроллера, лучше внедрить его, чем инициализировать его в контроллере, инициализация DbContext внутри контроллера нарушает SRP, потому что контроллер не заинтересован в инициализации DbContext.

...