实体框架6 - 可以从包管理器进行连接,但不能从Web API项目

时间:2017-04-06 13:11:42

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

我的解决方案包含两个项目。一个是Web API / angular2应用程序,另一个是与实体框架接口的数据访问层。我的Web应用程序项目引用此数据层项目以创建/检索数据。

尝试从我的数据库上下文中的dbsets添加新数据或检索时出现以下错误:

  

System.Data.SqlClient.SqlException:'与SQL Server建立连接时发生与网络相关或特定于实例的错误。服务器未找到或无法访问。验证实例名称是否正确,以及SQL Server是否配置为允许远程连接。 (提供程序:SQL网络接口,错误:26 - 找到指定的服务器/实例时出错)'

以下是我的数据层项目中的应用配置:

    <?xml version="1.0" encoding="utf-8"?>
<configuration>
  <configSections>
    <!-- For more information on Entity Framework configuration, visit http://go.microsoft.com/fwlink/?LinkID=237468 -->
    <section name="entityFramework" type="System.Data.Entity.Internal.ConfigFile.EntityFrameworkSection, EntityFramework, Version=6.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" requirePermission="false"/>
  </configSections>
  <entityFramework>
    <defaultConnectionFactory type="System.Data.Entity.Infrastructure.LocalDbConnectionFactory, EntityFramework">
      <parameters>
        <parameter value="mssqllocaldb"/>
      </parameters>
    </defaultConnectionFactory>
    <providers>
      <provider invariantName="System.Data.SqlClient" type="System.Data.Entity.SqlServer.SqlProviderServices, EntityFramework.SqlServer"/>
    </providers>
  </entityFramework>
  <connectionStrings>
    <add name="SettingBuilder" connectionString="Data Source=(LocalDb)\ProjectsV13;Initial Catalog=SettingBuilder;Integrated Security=SSPI;" providerName="System.Data.SqlClient"/>
  </connectionStrings>
<startup><supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.5.2"/></startup></configuration>

我已经在web api项目的web.config中复制了这个:

<?xml version="1.0" encoding="utf-8"?>
<configuration>
  <configSections>
    <section name="entityFramework" type="System.Data.Entity.Internal.ConfigFile.EntityFrameworkSection, EntityFramework, Version=6.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" requirePermission="false"/>
  </configSections>
  <entityFramework>
    <defaultConnectionFactory type="System.Data.Entity.Infrastructure.LocalDbConnectionFactory, EntityFramework">
      <parameters>
        <parameter value="mssqllocaldb"/>
      </parameters>
    </defaultConnectionFactory>
    <providers>
      <provider invariantName="System.Data.SqlClient" type="System.Data.Entity.SqlServer.SqlProviderServices, EntityFramework.SqlServer"/>
    </providers>
  </entityFramework>
  <connectionStrings>
    <add name="SettingBuilder" connectionString="Data Source=(LocalDb)\ProjectsV13;Initial Catalog=SettingBuilder;Integrated Security=SSPI;" providerName="System.Data.SqlClient"/>
  </connectionStrings>
  <system.webServer>
    <handlers>
      <add name="aspNetCore" path="*" verb="*" modules="AspNetCoreModule" resourceType="Unspecified"/>
    </handlers>
    <aspNetCore processPath="%LAUNCHER_PATH%" arguments="%LAUNCHER_ARGS%" stdoutLogEnabled="false" stdoutLogFile=".\logs\stdout" forwardWindowsAuthToken="false"/>
  </system.webServer>
</configuration>

数据库确实存在 - 当我尝试从包管理器控制台添加迁移或更新数据库时,没有问题,这些都成功了。

我无法从Web API项目连接到数据库的原因是什么,但是从控制台执行此操作没有问题?

这是我的数据库上下文类的结构:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Data.Entity;

namespace SettingBuilder.Data
{
    public class SettingBuilderContext : DbContext
    {
        public DbSet<Setting> Settings { get; set; }

        public SettingBuilderContext() //: base("SettingBuilder")
        {

        }

        protected override void OnModelCreating(DbModelBuilder modelBuilder)
        {
            modelBuilder.Entity<Setting>().ToTable("Setting");
        }
    }
}

我遵循一个工作单元模式 - 为了避免在这里粘贴所有代码,实例化一个工作单元也实例化db上下文。以下是我在web api中从控制器看的内容:

[HttpPost("[action]")]
public void CreateSetting([FromBody]Setting setting)
{
    _unitOfWork.SettingRepository.CreateSetting(setting);
    _unitOfWork.Save();
}

非常感谢任何帮助。

编辑:我已经制作了一个简单的控制台应用程序来测试它。从控制台应用程序,它的工作原理 - 我刚刚从我的数据层项目中复制了app.config。但是,DB已在具有完全限定名称的不同位置创建,而不是我在app.config中指定的名称(它创建了SettingBuilder.Data.SettingBuilderContext作为数据库)

这使我假设框架没有引用我的app配置文件。有没有办法配置它?

编辑2:如果我手动硬编码我的连接字符串,这也有效。我只是将它从webconfig复制到db上下文初始化。

0 个答案:

没有答案