Я нашел сценарий, в котором выполняются обе стороны оператора 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
Стек вызовов в исключении
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
[Обновить] После включения исключения разрываЯ вижу
Указывает, что для пользователя не удалось войти в систему.
+ $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