2015-05-08 8 views
6

Gdy EF próbuje połączyć się z bazą danych sql Azure (być może podczas próby otwarcia połączenia z bazą danych, nie wiesz), próbuje połączyć/zalogować się do master bazy danych, pytanie brzmi: dlaczego?Struktura encji, najpierw kod: Unikaj niechcianych połączeń z bazą danych master azure

Użytkownik ciągu połączenia nie może się połączyć z główną bazą danych, z tego, co widzę zalogowany, błędy pojawiają się w EF, próbując bezskutecznie zalogować się do głównej bazy danych z użytkownikiem, ale funkcjonalnie aplikacja działa poprawnie (aplikacja nie wymaga dostępu do głównej bazy danych, aby cokolwiek zrobić).

Z moich badań wydaje się najbardziej podobny do this issue, ale został zamknięty jako nie odtwarzalny i nie jestem pewien, czy dzieje się tak podczas próby uzyskania ProviderManifestToken.

Tak więc, biorąc pod uwagę użytkownika bazy danych z odpowiednimi uprawnieniami do bazy danych, której potrzebuje, oraz odpowiadający temu ciąg połączenia, dlaczego EF próbuje połączyć się z główną bazą danych?

Przykładowy łańcuch połączenia dla kontekstu

Server=tcp:MyServer;Database=MyDb;User ID=MyDatabaseUser;Password=*****;Trusted_Connection=False;Encrypt=True;Connection Timeout=30;TrustServerCertificate=False; 

komunikat Log poniżej:

15-05-07 04:06:16.404 System.Data.SqlClient.SqlException (0x80131904): The server principal "MyDatabaseUser" is not able to access the database "master" under the current security context. 
Database 'master' on server 'MyServer' is not currently available. Please retry the connection later. If the problem persists, contact customer support, and provide them the session tracing ID of '69955F47-7746-41560-A03C-807FB9A56478A'. 
Login failed for user 'MyDatabaseUser'. 
    at System.Data.SqlClient.SqlInternalConnection.OnError(SqlException exception, Boolean breakConnection, Action`1 wrapCloseInAction) 
    at System.Data.SqlClient.TdsParser.ThrowExceptionAndWarning(TdsParserStateObject stateObj, Boolean callerHasConnectionLock, Boolean asyncClose) 
    at System.Data.SqlClient.TdsParser.TryRun(RunBehavior runBehavior, SqlCommand cmdHandler, SqlDataReader dataStream, BulkCopySimpleResultSet bulkCopyHandler, TdsParserStateObject stateObj, Boolean& dataReady) 
    at System.Data.SqlClient.TdsParser.Run(RunBehavior runBehavior, SqlCommand cmdHandler, SqlDataReader dataStream, BulkCopySimpleResultSet bulkCopyHandler, TdsParserStateObject stateObj) 
    at System.Data.SqlClient.SqlInternalConnectionTds.CompleteLogin(Boolean enlistOK) 
    at System.Data.SqlClient.SqlInternalConnectionTds.AttemptOneLogin(ServerInfo serverInfo, String newPassword, SecureString newSecurePassword, Boolean ignoreSniOpenTimeout, TimeoutTimer timeout, Boolean withFailover) 
    at System.Data.SqlClient.SqlInternalConnectionTds.LoginNoFailover(ServerInfo serverInfo, String newPassword, SecureString newSecurePassword, Boolean redirectedUserInstance, SqlConnectionString connectionOptions, SqlCredential credential, TimeoutTimer timeout) 
    at System.Data.SqlClient.SqlInternalConnectionTds.OpenLoginEnlist(TimeoutTimer timeout, SqlConnectionString connectionOptions, SqlCredential credential, String newPassword, SecureString newSecurePassword, Boolean redirectedUserInstance) 
    at System.Data.SqlClient.SqlInternalConnectionTds..ctor(DbConnectionPoolIdentity identity, SqlConnectionString connectionOptions, SqlCredential credential, Object providerInfo, String newPassword, SecureString newSecurePassword, Boolean redirectedUserInstance, SqlConnectionString userConnectionOptions, SessionData reconnectSessionData) 
    at System.Data.SqlClient.SqlConnectionFactory.CreateConnection(DbConnectionOptions options, DbConnectionPoolKey poolKey, Object poolGroupProviderInfo, DbConnectionPool pool, DbConnection owningConnection, DbConnectionOptions userOptions) 
    at System.Data.ProviderBase.DbConnectionFactory.CreatePooledConnection(DbConnectionPool pool, DbConnection owningObject, DbConnectionOptions options, DbConnectionPoolKey poolKey, DbConnectionOptions userOptions) 
    at System.Data.ProviderBase.DbConnectionPool.CreateObject(DbConnection owningObject, DbConnectionOptions userOptions, DbConnectionInternal oldConnection) 
    at System.Data.ProviderBase.DbConnectionPool.UserCreateRequest(DbConnection owningObject, DbConnectionOptions userOptions, DbConnectionInternal oldConnection) 
    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.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.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.SqlServer.SqlProviderServices.<>c__DisplayClass33.<UsingConnection>b__32() 
    at System.Data.Entity.Infrastructure.DbExecutionStrategy.<>c__DisplayClass1.<Execute>b__0() 
    at System.Data.Entity.Infrastructure.DbExecutionStrategy.Execute[TResult](Func`1 operation) 
ClientConnectionId:5a5e2892-0d1f-471c-a1b7-5f9e5705655f1 
ErrorCode: 916 
ErrorCode: 40613 
ErrorCode: 18456 

Odpowiedz

6

Entity Framework próbuje połączyć się z bazą danych master ponieważ kod Pierwsze próby stworzenia bazy dla projektu jeśli nie istnieje. Można to zrobić tylko z poziomu master.

Nadal można korzystać z Code First i pracować z istniejącą bazą danych, ale należy przynajmniej zmienić ustawienia, aby nie próbować tworzyć bazy danych. Możesz ustawić go na aktualizacje, to dobrze. Moją osobistą preferencją jest wyłączenie zarządzania bazami danych i sam sobie z tym poradzę.

Odbywa się to poprzez tworzenie konstruktora statycznego przeciążenia na DbContext:

public static MyContext() : base(null) {} 

This link omawia różne inicjatorów bazy danych, które są dostępne. Powyższy konstruktor statyczny nie tworzy inicjalizatora. Here to kolejne łącze omawiające te same inicjalizatory, jak również tworzenie niestandardowych.

+0

Ale jeśli baza danych istnieje (działa), dlaczego miałaby spróbować ją odtworzyć? lub czy przechodzi do mastera, aby sprawdzić, czy baza danych istnieje, a kiedy to się nie powiedzie, spróbuj mimo to, aby aplikacja działała poprawnie. Aplikacja działa dobrze, tylko te przerywane błędy w dzienniku. – Mayoweezy

+0

Wyobrażam sobie, że automatycznie przechodzi do gałęzi 'master', dzięki czemu może uruchomić zapytanie, które zwraca strukturę tabel w bazie danych. – krillgar