Почему обе стороны оператора if выполняются? - PullRequest
0 голосов
/ 17 декабря 2018

Я нашел сценарий, в котором выполняются обе стороны оператора if.Почему?

Я не думал, что это возможно в C #.

Проблема возникает при втором запуске XAF EF Code First.После того как я удалил изначально созданные файлы .mdf и _log.ldf.

Когда я выполняю код, оператор! Database.Exists оценивается как true.

Затем, когда я нажимаю F11 (в точке, прокомментированной во фрагменте кода после создания базы данных, не существует) следующий шаг, который я вижу в отладчике, - в операторе catch.

Фрагмент кода из Dev Express.pdb-файл и, к сожалению, оператор catch не дает мне способа проверить сообщение об ошибке.

protected virtual DatabaseSchemaState CheckDatabaseSchemaCompatibilityCore(Object context) 
{
    DatabaseSchemaState result = DatabaseSchemaState.SchemaExists;
    if(context is DbContext) 
    {
        Database database = ((DbContext)context).Database;
        if(!database.Exists()) 
        {
            // If I press F11 here
            result = DatabaseSchemaState.DatabaseMissing;  
        }
        else 
        {
            try 
            {
                if (!database.CompatibleWithModel(false)) 
                {
                    result = DatabaseSchemaState.SchemaRequiresUpdate;
                }
            }
            catch 
            {
                // the next step is here
                result = DatabaseSchemaState.SchemaRequiresUpdate;  
            }
        }
    }

    // etc
}

В окне потока показано, что оба шага находятся в одном потоке.

Когда я нажимаю F11 в строке 318, через несколько секунд следующий шаг, который я вижу выделенным, это строка 327

the second step

Стек вызовов в исключении

DevExpress.ExpressApp.EF.v18.2.dll!DevExpress.ExpressApp.EF.EFObjectSpaceProvider.CheckDatabaseSchemaCompatibilityCore(object context) Line 327 C#
        DevExpress.ExpressApp.EF.v18.2.dll!DevExpress.ExpressApp.EF.EFObjectSpaceProvider.CreateObjectContext(System.Collections.Generic.IList<System.IDisposable> disposableObjects) Line 182 + 0xc bytes  C#
        DevExpress.ExpressApp.EF.v18.2.dll!DevExpress.ExpressApp.EF.EFObjectSpaceProvider.Init(System.Type contextType, DevExpress.ExpressApp.DC.ITypesInfo typesInfo, DevExpress.ExpressApp.EF.EFTypeInfoSource typeInfoSource, System.Data.Common.DbConnection connection, string connectionString, string metadataLocations, string providerName) Line 116 + 0xd bytes   C#
        DevExpress.ExpressApp.EF.v18.2.dll!DevExpress.ExpressApp.EF.EFObjectSpaceProvider.EFObjectSpaceProvider(System.Type contextType, DevExpress.ExpressApp.DC.ITypesInfo typesInfo, DevExpress.ExpressApp.EF.EFTypeInfoSource typeInfoSource, string connectionString, string metadataLocations, string providerName) Line 209 + 0x15 bytes C#
        DevExpress.ExpressApp.EF.v18.2.dll!DevExpress.ExpressApp.EF.EFObjectSpaceProvider.EFObjectSpaceProvider(System.Type contextType, DevExpress.ExpressApp.DC.ITypesInfo typesInfo, DevExpress.ExpressApp.EF.EFTypeInfoSource typeInfoSource, string connectionString) Line 215 + 0x17 bytes    C#
        DXApplicationkg1.Win.exe!DXApplicationkg1.Win.DXApplicationkg1WindowsFormsApplication.CreateDefaultObjectSpaceProvider(DevExpress.ExpressApp.CreateCustomObjectSpaceProviderEventArgs args) Line 35 + 0x66 bytes    C#
        DevExpress.ExpressApp.v18.2.dll!DevExpress.ExpressApp.XafApplication.CreateObjectSpaceProviders(string connectionString) Line 294 + 0xc bytes   C#
        DevExpress.ExpressApp.v18.2.dll!DevExpress.ExpressApp.XafApplication.Setup() Line 1543 + 0x1e bytes C#
        DXApplicationkg1.Win.exe!DXApplicationkg1.Win.Program.Main() Line 45 + 0xa bytes    C#

Кнопка «Оптимизировать код» на вкладке «Сборка» не проверена.

Код взят из файлов DevExpress .pdb

[Обновить] После включения исключения разрываЯ вижу

this exception

Указывает, что для пользователя не удалось войти в систему.

+       $exception  {System.Data.Entity.Core.EntityException: The underlying provider failed on Open. ---> System.Data.SqlClient.SqlException: Cannot open database "DXApplicationkg1" requested by the login. The login failed.
Login failed for user 'MYCOMPUTER\kirst'.
   at System.Data.ProviderBase.DbConnectionPool.TryGetConnection(DbConnection owningObject, UInt32 waitForMultipleObjectsTimeout, Boolean allowCreate, Boolean onlyOneCheckConnection, DbConnectionOptions userOptions, DbConnectionInternal& connection)
   at System.Data.ProviderBase.DbConnectionPool.TryGetConnection(DbConnection owningObject, TaskCompletionSource`1 retry, DbConnectionOptions userOptions, DbConnectionInternal& connection)
   at System.Data.ProviderBase.DbConnectionFactory.TryGetConnection(DbConnection owningConnection, TaskCompletionSource`1 retry, DbConnectionOptions userOptions, DbConnectionInternal oldConnection, DbConnectionInternal& connection)
   at System.Data.ProviderBase.DbConnectionInternal.TryOpenConnectionInternal(DbConnection outerConnection, DbConnectionFactory connectionFactory, TaskCompletionSource`1 retry, DbConnectionOptions userOptions)
   at System.Data.ProviderBase.DbConnectionClosed.TryOpenConnection(DbConnection outerConnection, DbConnectionFactory connectionFactory, TaskCompletionSource`1 retry, DbConnectionOptions userOptions)
   at System.Data.SqlClient.SqlConnection.TryOpenInner(TaskCompletionSource`1 retry)
   at System.Data.SqlClient.SqlConnection.TryOpen(TaskCompletionSource`1 retry)
   at System.Data.SqlClient.SqlConnection.Open()
   at System.Data.Entity.Infrastructure.Interception.DbConnectionDispatcher.<Open>b__36(DbConnection t, DbConnectionInterceptionContext c)
   at System.Data.Entity.Infrastructure.Interception.InternalDispatcher`1.Dispatch[TTarget,TInterceptionContext](TTarget target, Action`2 operation, TInterceptionContext interceptionContext, Action`3 executing, Action`3 executed)
   at System.Data.Entity.Infrastructure.Interception.DbConnectionDispatcher.Open(DbConnection connection, DbInterceptionContext interceptionContext)
   at System.Data.Entity.Core.EntityClient.EntityConnection.<Open>b__2()
   at System.Data.Entity.SqlServer.DefaultSqlExecutionStrategy.<>c__DisplayClass1.<Execute>b__0()
   at System.Data.Entity.SqlServer.DefaultSqlExecutionStrategy.Execute[TResult](Func`1 operation)
   at System.Data.Entity.SqlServer.DefaultSqlExecutionStrategy.Execute(Action operation)
   at System.Data.Entity.Core.EntityClient.EntityConnection.Open()
   --- End of inner exception stack trace ---
   at System.Data.Entity.Core.EntityClient.EntityConnection.Open()} System.Exception {System.Data.Entity.Core.EntityException}

[Обновить]

Комментарий Кароля

Если обе «стороны» оператора IF выполняются, это означает, что вы выполнили метод дважды.

Однако если я поместил разрыв в строку 314, он будет достигнут только один раз.

Я должен упомянуть, что я работаю под управлением Windows 10 1809

Я задал соответствующий вопрос по адресу Dev Express

1 Ответ

0 голосов
/ 18 декабря 2018

Документы объясняют здесь , чтобы проверить опцию «Подавить оптимизацию JIT при загрузке модуля (только для управляемого)» в опциях отладки.

Когда я это сделал, только else часть, если инструкция if была выполнена в отладчике.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...