簡體   English   中英

Web API和實體框架,在哪里指定數據庫連接?

[英]Web API & Entity Framework, Where to specify Database connection?

我將盡力解釋這個問題。

我從兩個項目開始:

項目一:數據模型


包裝具有單個DbSet的DbContext的存儲庫類:RentalListings

此DbContext使用默認設置,以便在保存更改時將其保存到本地數據庫。

項目二:控制台應用程序


包含一個控制台應用程序,該控制台應用程序在運行時實例化存儲庫類的實例。

然后,它創建多個“ RentalListings”並將其保存到資源庫中。


到現在為止還挺好。 運行控制台應用程序后,我檢查了本地DB SQL對象瀏覽器,並且我的存儲庫類已成功保存到該數據庫。

現在,我想要一種通過Web API訪問此插入數據的方法。 所以我添加:

項目三:Web API

我創建了一個新的控制器類,並添加了一個GET操作方法來獲取所有列表。

當我運行API項目時,可以點擊action方法,如下所示:

[HttpGet]
public IEnumerable<RentalListing> GetAllListings() {
            StatsRepository repository = new StatsRepository(new StatsContext());
            return repository.GetRentalListings();
        }

通過正確的URL。 但是我收到以下錯誤:

Unable to complete operation. The supplied SqlConnection does not specify an initial catalog or AttachDBFileName.

現在,通過搜索網絡,我認為問題在於它不知道如何訪問數據庫??? 而且我應該在我的Web API項目的Web.config文件中指定一個連接字符串。

問題:

1)我的控制台應用程序(未指定連接字符串)如何使用我的存儲庫類創建mdf數據庫?

2)為什么我的Web api項目無法正常工作? 難道不能像控制台應用程序一樣使用存儲庫來獲取數據庫嗎?

期待聽到您的答復,謝謝!

問:1。 未指定連接字符串的控制台應用程序如何使用我的存儲庫類創建mdf數據庫?

答:1。 默認情況下,如果您未在控制台應用程序上指定連接字符串,則它將使用您的上下文類名稱空間以及上下文類的名稱來創建數據庫。

例如

上下文類名稱空間= MyDbContextNameSpace

上下文類的名稱= MyContext

然后,您的數據庫名稱將如下所示: MyDbContextNameSpace.MyContext

注意:如果安裝了SQL Express,則會在本地SQL Express實例(。\\ SQLEXPRESS)上創建數據庫。 如果未安裝SQL Express,則Code First將嘗試並使用LocalDb((localdb)\\ v11.0)。

您可以在這里閱讀有關它的更多信息: 建立初始模型和數據庫

問:2。 為什么我的Web api項目無法正常工作? 難道不能像控制台應用程序一樣使用存儲庫來獲取數據庫嗎?

A2。 通過Http/s與EF通訊時,必須在web.config文件中提供連接字符串。 否則EF不知道該怎么做,這是設計使然。

例如

MyContext.cs

public class MyContext : DbContext
{
    public MyContext() : base(“name=MyContextConn”)
    {
    }

      public DbSet<Blog> Blogs { get; set; }
}

web.config中

<connectionStrings>
    <add name=“MyContextConn“ connectionString=“conndetails” 
         providerName=“System.Data.SqlClient“ />
</connectionStrings>
  1. 就像您說的那樣, DbContext類絕對可以負責“指定連接字符串”,但是在配置文件中最常見的原因是可以為不同的配置指定不同的連接字符串。 例如,您的Web.Debug.config連接字符串可能指向您已安裝在開發盒上的Web.Release.config實例,而Web.Release.config連接字符串可能指向Azure中包含的Sql實例。
  2. 在配置文件中指定連接字符串不一定能解決該問題。 連接字符串可以指定用戶名和密碼。 如果將它們放在連接字符串中,則很可能會起作用。 例如, <add name="DefaultConnection" connectionString="Server=myServerAddress;Database=myDataBase;User Id=myUsername;Password=myPassword;" providerName="System.Data.SqlClient" /> <add name="DefaultConnection" connectionString="Server=myServerAddress;Database=myDataBase;User Id=myUsername;Password=myPassword;" providerName="System.Data.SqlClient" />
  3. 您遇到的問題很可能是由於控制台應用程序在Windows用戶啟動該應用程序的上下文中運行的事實所致。 它正在使用這些憑據連接到數據庫。 我假設您的控制台,webapi應用程序和sql都已在同一台計算機上安裝/運行,並且您的用戶是您用來登錄sql的唯一用戶(再次假設您使用的是SSMS)。 Web應用程序很可能是通過IIS或IISExpress運行的,默認情況下,IIS或IISExpress在不同的上下文下運行(我相信IIS的IUSR)。 如果您想讓您的連接字符串使用集成安全性(將用戶名和密碼保留在配置之外-通常被認為是一種好習慣),如下所示: <add name="DefaultConnection" connectionString="Data Source=myServerAddress;Initial Catalog=myDataBase;Integrated Security=True" providerName="System.Data.SqlClient" />那么您將需要通過更新運行apppool的用戶來設置運行應用程序的上下文。 您可以通過更新應用程序池標識 ,然后確保Web應用程序正在使用該應用程序池來做到這一點

希望這可以幫助。

暫無
暫無

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

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