【问题标题】:Web API & Entity Framework, Where to specify Database connection?Web API 和实体框架,在哪里指定数据库连接?
【发布时间】:2017-04-14 06:15:51
【问题描述】:

我将尽可能清楚地解释这个问题。

我从两个项目开始:

项目一:数据模型


包装了具有单个 DbSet 的 DbContext 的存储库类:RentalListings

此 DbContext 使用默认设置,因此当我保存更改时,它会保存到本地 DB。

项目二:控制台应用


包含一个控制台应用程序,该应用程序在运行时会实例化存储库类的一个实例。

然后它会创建多个“RentalListings”并将它们保存到存储库中。


到目前为止一切顺利。运行控制台应用程序后,我检查本地数据库 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 项目不能使用相同的方法?它不能像控制台应用一样只使用存储库来获取数据库吗?

期待收到回复,在此先感谢!

【问题讨论】:

    标签: c# entity-framework asp.net-web-api


    【解决方案1】:
    1. DbContext 类绝对可以负责“指定连接字符串”,正如您所说,但它最常见于配置文件中的原因是可以为不同的配置指定不同的连接字符串。例如,您的Web.Debug.config 连接字符串可能指向您已在开发框中安装的 SqlExpress 实例,而Web.Release.config 连接字符串可能指向 Azure 中包含的 Sql 实例。
    2. 在配置文件中指定连接字符串不一定能解决问题。连接字符串可以指定用户名和密码。如果您将它们放入连接字符串,那么它很可能会起作用。例如&lt;add name="DefaultConnection" connectionString="Server=myServerAddress;Database=myDataBase;User Id=myUsername;Password=myPassword;" providerName="System.Data.SqlClient" /&gt;
    3. 您遇到的问题很可能是由于控制台应用程序是在 Windows 用户启动应用程序的上下文中运行的。它正在使用这些凭据连接到数据库。我假设您的控制台、webapi 应用程序和 sql 都安装/运行在同一台机器上,并且您的用户是您用来登录 sql 的唯一用户(再次假设您使用的是 SSMS)。 Web 应用程序很可能通过 IIS 或 IISExpress 运行,默认情况下它们在不同的上下文中运行(我相信 IIS 的 IUSR)。如果您想让您的连接字符串使用集成安全性(将您的用户名和密码排除在您的配置之外——这通常被认为是一种好的做法),如下所示:&lt;add name="DefaultConnection" connectionString="Data Source=myServerAddress;Initial Catalog=myDataBase;Integrated Security=True" providerName="System.Data.SqlClient" /&gt; 那么您需要设置应用程序的上下文通过更新运行 apppool 的用户来运行。您可以通过 updating the app pool identity 执行此操作,然后确保 Web 应用程序是 using that app pool

    希望这会有所帮助。

    【讨论】:

      【解决方案2】:

      Q :1. 我的控制台应用程序(未指定连接字符串)如何使用我的存储库类创建 mdf 数据库?

      A :1. 默认情况下。如果您没有在控制台应用程序上指定连接字符串,那么它将使用您的上下文类命名空间加上上下文类的名称来创建一个数据库。

      例如

      上下文类命名空间 = MyDbContextNameSpace

      上下文名称 class= MyContext

      那么您的数据库名称将是这样的:MyDbContextNameSpace.MyContext

      注意:如果安装了 SQL Express,则在本地 SQL Express 实例 (.\SQLEXPRESS) 上创建数据库。如果未安装 SQL Express,则 Code First 将尝试使用 LocalDb ((localdb)\v11.0)。

      您可以在这里阅读更多信息:Building an Initial Model & Database

      Q :2. 为什么我的 web api 项目不能使用相同的方法?不能像控制台应用一样只使用存储库来获取数据库吗?

      A :2. 当您通过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>
      

      【讨论】:

      • 非常感谢您提供的信息。它帮助我理解了为什么我的控制台应用程序不需要连接字符串(约定意味着它使用本地数据库创建了一个 MDF 文件)。至于为什么使用完全相同的数据库上下文的 Web API 项目不能做同样的事情,仍然有点模糊。但我现在只能接受!
      • 非常欢迎您 :) 关于您的问题,当您通过 HTTP/S(web/web Api)使用 EF 时,EF 的设计是这样的。这就是它无法正常工作的原因在这种情况下控制台应用程序。
      猜你喜欢
      • 1970-01-01
      • 2023-03-09
      • 1970-01-01
      • 1970-01-01
      • 2013-10-13
      • 2017-06-19
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多