DBCONTEXT утилизируется слишком рано. У меня есть возможные решения, и я не могу решить, что делатьC#

Место общения программистов C#
Ответить Пред. темаСлед. тема
Anonymous
 DBCONTEXT утилизируется слишком рано. У меня есть возможные решения, и я не могу решить, что делать

Сообщение Anonymous »

У меня есть конечная точка Pay в проекте ASP.net Web API. Он вызывает несколько сервисов, включая скидку с Discountservice на уровне приложения). Эта служба имеет 5 методов.
Я добавил PayloggerService в классе Discountservice и я называю его logmessage () в 4 разных местах В скидке Scountservice .
Это последовательность методов, выполненных в одном запросе:

Код: Выделить всё

Pay()
-> DiscountService -> DiscountService.A()
-> PayLoggerService.LogMessage()
-> DiscountService.B() -> PayLoggerService.LogMessage().
< /code>
Проблема: < /p>
DbContext
утилизируется, если я вызываю savechangesasync () после каждого logmessage () .
ошибка:

не может получить доступ к экземпляру утилизированного контекста. Распространенной причиной этой ошибки является утилизация экземпляра контекста, который был разрешен от инъекции зависимостей, а затем пытался использовать один и тот же экземпляр контекста в другом месте вашего приложения. Это может произойти, если вы звоните «распоряжаться» на экземпляре контекста или обертываете его в оператор использования. Если вы используете инъекцию зависимостей, вы должны позволить контейнеру для инъекции зависимости позаботиться об утилизации экземпляров контекста

Это происходит после Scountservice.a () Вызовы logMessage () , поскольку logmessage () вызывает savechangesasync () в конце:

Код: Выделить всё

public class DiscountService
{
private readonly PayLoggerService _payLoggerService;

public DiscountService(PayLoggerService payLoggerService)
{
_payLoggerService = payLoggerService;
}

// NOT ASYNC. Has too many references to make it async now.
public string A()
{
// Do some work
_payLoggerService.LogMessage(message).ConfigureAwait(false);
}

// This will not be entered if LogMessage(executed from A(), will call SaveChangesAsync())
public string B()
{
// Do some work
_payLoggerService.LogMessage(message).ConfigureAwait(false);
}
}

public class PayLoggerService : GeneralService
{
public PayLoggerService(PayingContext dbContext) : base(dbContext)
{
}

public async Task LogMessage(string message)
{
// Irrelevant code

var bettingHistory = new BettingHistory
{
// Irrelevant code
};

// DbScope is of type PayingContext, created in GeneralService.cs
await DbScope.PayLogs.AddAsync(bettingHistory);
await DbScope.SaveChangesAsync(); // This line causes an error.
}
}
< /code>
Возможные решения, о которых я подумал: < /p>

[*] Реализовать единицу работы и вызовать Savechanges < /code> оттуда в Pay () 
endpoint
[*] реализация dbcontextfactory и создавать новый экземпляр dbcontext каждый раз, когда мне это нужно
< /ul>
Есть ли что -нибудь лучше?>

Подробнее здесь: https://stackoverflow.com/questions/794 ... d-cant-dec
Реклама
Ответить Пред. темаСлед. тема

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

  • Похожие темы
    Ответы
    Просмотры
    Последнее сообщение

Вернуться в «C#»