Почему обе стороны оператора if выполняются?
Я нашел сценарий, в котором выполняются обе стороны оператора if. Зачем?
Я не думал, что это возможно в C#.
Проблема возникает во второй раз, когда я запускаю решение XAF EF Code First. После того как я удалил изначально созданные файлы.mdf и _log.ldf.
Когда я выполняю код, оператор! Database.Exists оценивается как true.
Затем, когда я нажимаю F11 (в точке, прокомментированной во фрагменте кода после создания базы данных, не существует), следующий шаг, который я вижу в отладчике, заключается в операторе catch.
Фрагмент кода взят из файла.pdb Dev Express, и, к сожалению, оператор 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
Стек вызовов в исключении
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#
Кнопка "Оптимизировать код" на вкладке "Сборка" не отмечена.
Код взят из файлов Dev Express .pdb
[Обновление] После включения исключения перерыва я вижу
Указывает, что для пользователя не удалось войти в систему.
+ $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 ответ
Документы объясняют здесь, чтобы проверить опцию "Подавить оптимизацию JIT при загрузке модуля (только для управляемого)" в опциях отладки.
Когда я делал это, только часть else, если в отладчике выполнялась инструкция if.