C # Условное удаление Entity Framework DbContext только при необходимости - PullRequest
2 голосов
/ 25 апреля 2019

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

В принципе, если в метод передается реальный контекст, тогда я Не хочу избавиться от него. Однако, если это необходимо только для текущего времени выполнения рассматриваемого метода, оно будет размещено в блоке finally

public int UpSertCompanyStockInfo( Guid companyId, string companyName, float stockPrice, float peRatio, CommunicationEngineDatabase context)
{
    bool isContextOnlyCreatedForCurrentMethodExecutionRun = false;
    if (context == null)
    {
        isContextOnlyCreatedForCurrentMethodExecutionRun = true;
        context = new CommunicationEngineDatabase();
    }
    try
    {
        CompanyStockInfo companyStockInfo = new CompanyStockInfo();
        companyStockInfo.CompanyName = companyName;
        companyStockInfo.StockPrice = stockPrice;

        context.CompanyStockInfoTable.Add(companyStockInfo);
        context.SaveChanges();
    }
    catch (Exception _ex)
    {

    }
    finally
    {
        if (isContextOnlyCreatedForCurrentMethodExecutionRun == true && context != null)
        {
            ((IDisposable)context).Dispose();
        }

    }
    return 0;

}

Проблема в том, что я чувствую, что вышеупомянутый код слишком много с точки зрения строк кода. Может кто-нибудь сказать мне, как сократить его (возможно, даже сделать это с помощью оператора using)?

1 Ответ

3 голосов
/ 25 апреля 2019

Вы можете инкапсулировать логику внутри одноразового вспомогательного (то есть вы можете использовать using) класса (даже struct) следующим образом:

class DbContextScope : IDisposable
{
    public static DbContextScope Open<TContext>(ref TContext context) where TContext : DbContext, new()
        => context != null ? NullScope : new DbContextScope(context = new TContext());
    static readonly DbContextScope NullScope = new DbContextScope(null);
    private DbContextScope(DbContext context) => this.context = context;
    readonly DbContext context;
    public void Dispose() => context?.Dispose();
}

И использование с вашим образцом будет:

public int UpSertCompanyStockInfo( Guid companyId, string companyName, float stockPrice, float peRatio, CommunicationEngineDatabase context)
{
    using (DbContextScope.Open(ref context))
    {
        CompanyStockInfo companyStockInfo = new CompanyStockInfo();
        companyStockInfo.CompanyName = companyName;
        companyStockInfo.StockPrice = stockPrice;

        context.CompanyStockInfoTable.Add(companyStockInfo);
        context.SaveChanges();
    }
    return 0;    
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...