簡體   English   中英

如何避免Entity Framework與空/空數據庫的連接

[英]How to avoid connections against empty/null database by Entity Framework

我們使用實體框架從現有數據庫中讀取。 這是我們代碼的簡化版本。

using (my context context = new mycontext())
{
    if(context.Database.Connection.State == System.Data.ConnectionState.Closed)
    {
        _logger.Info(" Opening the connection to the database");
        context.Database.Connection.Open();
    }

    context.Configuration.LazyLoadingEnabled = false;          
    IQueryable<mymodel> people;
    people = context.People.OrderBy(x => x.Firstname);
    _lstContacts = people.ToList();

    if (context.Database.Connection.State != System.Data.ConnectionState.Closed)
    {
        context.Database.Connection.Close();
        context.Database.Connection.Dispose();
        _logger.Info(" Connection to the database Closed");
    }
}

它可以在100%的時間內工作,但是......在我們的UAT環境中,我們可以看到與Microsoft SQL服務器的連接失敗並出現錯誤:

用戶“我的用戶”登錄失敗。 原因:無法打開顯式指定的數據庫“null”。 客戶我的IP。

對我們來說,這些是鬼連接,因為在我們看到SQL服務器中的錯誤時,我們的代碼不會被執行。 最初我們沒有明確地關閉和打開連接,我們剛剛添加它試圖控制何時打開EF並關閉連接,但它沒有解決問題。

我們的連接字符串使用以下格式:

<add name="MYCN" connectionString="metadata=res://*/CVs.Cvs.csdl|res://*/CVs.Cvs.ssdl|res://*/CVs.Cvs.msl;provider=System.Data.SqlClient;provider connection string="data source=myserver\;initial catalog=mydatabase;Integrated Security=;User ID=myuser;Password=XXXXXXX;MultipleActiveResultSets=True;App=EntityFramework"/>

正如您所看到的,我們在連接字符串中指定數據庫,並且我們的用戶只能訪問我們的數據庫,因此我們理解EF在連接字符串中不包含數據庫時的錯誤,但我們不明白為什么它是試圖執行這些連接。 我們知道連接來自我們的應用程序,因為我們是唯一使用該特定用戶的人,IP是我們服務器的IP,並且因為SQL服務器中的日志告訴我們該應用程序是“EntityFramewrok”

我之前沒有親自看到錯誤,但是為你研究過,看到很多人都遇到了這里討論的同樣問題: https//blogs.msdn.microsoft.com/sql_protocols/2006/02/21/understanding-login -failed錯誤-18456錯誤的消息,在-SQL服務器2005 /

我閱讀了指定網站中的所有消息,以下是提供的解決方案,至少有一位其他用戶確認它有效。 你可能不會使用2005,因為你沒有在你的問題中指定你的版本,我相信一些解決方案仍然適用於你。 請嘗試以下列表。

解決方案清單

1)除了消息之外,請通過狀態編號檢查此錯誤的狀態編號和搜索解決方案,可能會提供更准確的解決方案建議。 列出了最常見的狀態: 項目清單

您可以在此處找到所有狀態錯誤說明: https//sqlblog.org/2011/01/14/troubleshooting-error-18456

2)確保用戶名和密碼正確無誤。

3)

  • 使用Windows身份驗證登錄到SQL Server。
  • 右鍵單擊出現的查詢窗口,然后選擇“在對象資源管理器中打開服務器”
  • 轉到對象資源管理器並打開“安全”文件夾,然后打開“登錄”文件夾。
  • 雙擊“sa”用戶並更改密碼。 此外,與上面提到的其他用戶一樣,除了重置密碼之外,還要取消“強制密碼策略”。

4)嘗試更改密碼並關閉策略,並嘗試使用新密碼。

exec sp_password @new = ‘sqlpassword’, @loginame = ‘sa’
alter login sa
with password = ‘sqlpassword’ unlock,
check_policy = off,
check_expiration = off

5)在管理模式下運行您的應用程序/瀏覽器和SSMS(如果您使用它)。

6)

  • 打開Windows服務
  • 配置Microsoft Single Sign-on Service以使用正確的帳戶
  • 打開管理中心>>操作>>管理單點登錄的設置
  • 配置屬性以使用用於Microsoft“單點登錄服務”的同一帳戶

7)轉到Sql server配置管理器並啟用TCP / IP和命名管道

8)

  • 去sql server
  • 右鍵單擊服務器,選擇屬性
  • 點擊安全性
  • 在服務器身份驗證上,啟用SQL Server身份驗證

這可能有所幫助:

https://www.wikitechy.com/errors-and-fixes/sql/login-failed-error-18456-severity-14-state-38-reason-failed-to-open-the-explicitly-specified-database

https://dba.stackexchange.com/questions/90445/login-failed-for-user-error-18456-severity-14-state-38

我認為這只是UAT環境中myuser的訪問問題。 只需確保myuser可以在UAT環境中訪問UAT數據庫,你應該很好。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM