Метод SaveChangesAsync не сохраняет изменения (проблемы с окружением) - PullRequest
0 голосов
/ 03 октября 2018

У меня проблема со средой.
Вопрос выглядит так же, как и с несколькими другими вопросами:
Метод SaveChangesAsync () не обновляет базу данных
Entity Framework6.1.0 SaveChangesAsync

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

Возможно, я должен проверитьЧто-то о моем db-пользователе \ db?
Также у меня есть несколько других серверов с абсолютно таким же кодом, который отлично работает.

Мой код:

public static async Task SaveResultsAsync(HbTestResult result)
{
    using (var data = new HbContex())
    {
        data.HbMonitor.Add(result);
        Logger.Instance.Error($" point 1 ");
        try
        {
            Logger.Instance.Error($"point 2");
            await data.SaveChangesAsync();
            Logger.Instance.Error($"point 3");
        }
        catch (Exception exception)
        {
            Logger.Instance.Error($"Ex_Db1.3: {exception.Message} and inner - chain: { ExceptionUtil.GetInnerExceptionsChainAsString(exception)}.");
        }
    }
}

Iвызовите его другим методом:

private async Task<bool> PerformTestingAndGetAllResults(HbTest test, ConfigModel notificationConfig, Constants.TestStatus status)
{
    //**** (some variables declaring etc)
    var i = 0;
    while (i < numberOfTests)
    {
        await PerformTesting();
        if (!test.TestStatus.IsValid && test.TestStatus.Status == stat)
        {
            numberOfFailedTests++;
        }
        await DbUtil.SaveResultsAsync(SetTestResultsForDb());
        i++;
    }
    return numberOfFailedTests > notificationConfig.FailuresAllowed;
}

Ну, также у меня нет отладки на этой машине, поэтому я должен использовать подходы с ведением журнала (но у меня есть полный доступ к БД, если это может помочь.

Мой код всегда получает «точку 2» в методе SaveResultsAsync, но никогда не получает «точку 3». И в то же время не возникает выброшенное исключение ... похоже, что поток просто зависили что-то в этом роде.

С учетными данными из connectionString Я могу выполнять любые операции с моей базой данных вручную (используя ssms).

env:Стандарт 2012 R2, IIS 6.2, база данных MSSQL

1 Ответ

0 голосов
/ 03 октября 2018

Спасибо за @PanagiotisKanavos.Я реализовал перехватчик EF6 и получил проблему.Проблема заключалась в следующем: ошибка 1827, ограничение (10240 МБ) лицензии для операций создания базы данных \ изменения даты в базе данных.Я не знаю, почему сущность не выбрасывает это как распространенное исключение, но это было в журналах, таких как:

- Асинхронное выполнение в 03.10.2008 14:50:42 +05:30 - Ошибка в течение 20 мс с ошибкой: не удалось выделить место для объекта 'dbo.table'. 'PK_table' в базе данных 'dbname', поскольку файловая группа 'PRIMARY' заполнена.Создайте место на диске, удалив ненужные файлы, удалив объекты в файловой группе, добавив дополнительные файлы в файловую группу или установив автоматический рост для существующих файлов в файловой группе.

поэтому полезными были ссылки: https://docs.microsoft.com/en-us/ef/ef6/fundamentals/configuring/config-file#logging-database-operations-to-a-file-ef61-onwards и http://www.entityframeworktutorial.net/entityframework6/database-command-interception.aspx

итоговый код: 1) web.config

<entityFramework>
    <defaultConnectionFactory type="System.Data.Entity.Infrastructure.LocalDbConnectionFactory, EntityFramework">
      <parameters>
        <parameter value="mssqllocaldb" />
      </parameters>
    </defaultConnectionFactory>
    <providers>
      <provider invariantName="System.Data.SqlClient" type="System.Data.Entity.SqlServer.SqlProviderServices, EntityFramework.SqlServer" />
    </providers>
    <interceptors>
      <interceptor type="System.Data.Entity.Infrastructure.Interception.DatabaseLogger, EntityFramework">
        <parameters>
          <parameter value="C:\inetpub\wwwroot\App_Data\LogOutput.txt"/>
          <parameter value="true" type="System.Boolean"/>
        </parameters>
      </interceptor>
    </interceptors>
  </entityFramework>

2) и этот класс в любом месте:

using System;
using System.Collections.Generic;
using System.Data.Common;
using System.Data.Entity.Infrastructure.Interception;
using System.Linq;
using System.Web;

namespace MobileConnectHM.Utils
{
    public class EFCommandInterceptor : IDbCommandInterceptor
    {
        public void NonQueryExecuted(DbCommand command, DbCommandInterceptionContext<int> interceptionContext)
        {
            LogInfo("NonQueryExecuted", String.Format(" IsAsync: {0}, Command Text: {1}", interceptionContext.IsAsync, command.CommandText));
        }

        public void NonQueryExecuting(DbCommand command, DbCommandInterceptionContext<int> interceptionContext)
        {
            LogInfo("NonQueryExecuting", String.Format(" IsAsync: {0}, Command Text: {1}", interceptionContext.IsAsync, command.CommandText));
        }

        public void ReaderExecuted(DbCommand command, DbCommandInterceptionContext<DbDataReader> interceptionContext)
        {
            LogInfo("ReaderExecuted", String.Format(" IsAsync: {0}, Command Text: {1}", interceptionContext.IsAsync, command.CommandText));
        }

        public void ReaderExecuting(DbCommand command, DbCommandInterceptionContext<DbDataReader> interceptionContext)
        {
            LogInfo("ReaderExecuting", String.Format(" IsAsync: {0}, Command Text: {1}", interceptionContext.IsAsync, command.CommandText));
        }

        public void ScalarExecuted(DbCommand command, DbCommandInterceptionContext<object> interceptionContext)
        {
            LogInfo("ScalarExecuted", String.Format(" IsAsync: {0}, Command Text: {1}", interceptionContext.IsAsync, command.CommandText));
        }

        public void ScalarExecuting(DbCommand command, DbCommandInterceptionContext<object> interceptionContext)
        {
            LogInfo("ScalarExecuting", String.Format(" IsAsync: {0}, Command Text: {1}", interceptionContext.IsAsync, command.CommandText));
        }

        private void LogInfo(string command, string commandText)
        {
            Console.WriteLine("Intercepted on: {0} :- {1} ", command, commandText);
        }
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...