【问题标题】:Accessing EF ConnectionString from different project within same solution MVC从同一解决方案 MVC 中的不同项目访问 EF ConnectionString
【发布时间】:2015-03-20 11:27:20
【问题描述】:

在尝试实现关注点分离时,我采用了一个 ASP.NET MVC 项目并将模型和 DBContext 放入同一解决方案中的单独项目中。现在我有一个包含 ViewModel、控制器和视图的 Project.Web,并且我有一个用于模型和 DAL 的 Projects.Entities。具有 ConnectionString 属性的 web.config 文件位于 Project.Web 项目中。

项目.Web

  <connectionStrings>
    <add name="SchoolContext" connectionString="Data Source=localhost;Initial Catalog=ContosoUniversity1;Integrated Security=True" providerName="System.Data.SqlClient" />
  </connectionStrings>

家庭控制器:

public class HomeController : Controller
{
    private SchoolContext db = new SchoolContext();

项目.实体

public class SchoolContext : DbContext
{
    public SchoolContext() : base("SchoolContext")
    {

    }

我的问题是 DBContext 没有获取 SchoolContext connectionString 名称,因为它在另一个项目的 web.config 中。我该如何减轻这种情况?当所有 MVC 组件都在同一个项目中时,一切正常。

【问题讨论】:

  • 使用带有连接字符串参数的 DbContext 构造函数。然后你可以从你的网络项目中传递这个,你的 DAL 不需要保留重复的值。
  • 认为这就是我想要做的,但不太确定在哪里实施。你能给我一个简单的例子吗?这就像我尝试过但无法开始工作public partial class MyEFEntities { public MyEFEntities(string connectionstring) : base(connectionstring) { } }

标签: c# asp.net-mvc entity-framework


【解决方案1】:

这基本上是我设置解决方案的方式。我可以让 web 项目 web.config 或测试项目 app.config 定义连接字符串。

数据项目

public class SchoolContext : DbContext
{
    public SchoolContext(string connectionString)
        : base(connectionString) { }
}

网络项目

web.config

<configuration>
    <connectionStrings>
        <add name="SchoolContextDb" connectionString="Data Source=..." />
    </connectionStrings>
    <appSettings>
        <add key="SchoolContext" value="SchoolContextDb" />
    </appSettings>
    ...
</configuration>

用法

string ConnectionString = System.Configuration.ConfigurationManager.AppSettings["SchoolContext"];

SchoolContext db = new SchoolContext("Name=" + ConnectionString);

我使用 DI 容器,因此我只在应用程序启动代码中真正查找连接字符串一次。但您可以将 ConnectionString 变量设为全局变量或设置在基本控制器中。

【讨论】:

    【解决方案2】:

    默认入口点解决方案使用连接字符串检查 web.config 并检查参考项目。

    1. 使用此代码 sn-p,它无法获取更多详细信息,您会收到任何错误。
    2. 您能否验证如果您更改 dbcontext 名称,您会遇到什么错误。默认情况下,如果未设置,则使用 dbcontext 类定义类名。
    3. 验证 ...
    4. 我希望您已经在配置文件中进行了设置。 验证上下文和命名空间

      <entityFramework>
    <contexts>
          <context type="ContosoUniversity.DAL.SchoolContext, ContosoUniversity.DAL">
            <databaseInitializer type="ContosoUniversity.DAL.SchoolInitializer, ContosoUniversity.DAL" />
          </context>
     </contexts>
     </entityFramework>

    【讨论】:

    • 我正在尝试拼凑您所要求的内容,因为它不是很清楚 1) 是的,我收到带有上述代码的错误消息。 Could not load type 'ContosoUniversity.DAL.SchoolContext' from assembly 'ContosoUniversity'. 2)我将 ConnectionString 名称更改为不同的名称,并得到与 1 相同的错误 4)是的,明确指出配置文件中有一个 connectionString。如果我将 DAL 和 Models 文件夹放在我的 WebUI 项目中,一切正常
    • 更新了我的回复....似乎上下文与程序集提及在配置中不匹配。如果这不起作用,那么您需要提供您的配置文件。
    • 我从您的 sn-p 中尝试了上面的“databaseinitializer”代码,但仍然有问题。然而,我只是注释掉了初始化程序,解决方案运行良好并显示了数据。所以至少我知道这不是无法获取连接字符串的问题。然而,我很困惑为什么 SchoolInitializer 类不执行,它位于 ContosoUniversity.DAL 命名空间的 Project.Entities 项目中。
    • 它本质上是这个例子asp.net/mvc/overview/getting-started/…,但我只是将 DAL 移到了它自己的项目中
    • 我希望我的回复与您的查询相同,如果是,请将其标记为答案。
    【解决方案3】:

    即使将 DAL 拆分到不同的项目中,我在第一个问题中的代码也很有效。问题是 EF Code First Initializer 没有被执行,这是因为当我将初始化程序代码移动到它自己的项目时,web.config 文件中没有正确的程序集。修改后的 web.config 应该如下所示(我在名为 ContosoUniversity.Entities 的项目中缺少 DAL 所在的 .Entities。

      <entityFramework>
        <contexts>
          <context type="ContosoUniversity.DAL.SchoolContext, ContosoUniversity.Entities">
            <databaseInitializer type="ContosoUniversity.DAL.SchoolInitializer, ContosoUniversity.Entities" />
          </context>
        </contexts>
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-09-06
      • 1970-01-01
      • 1970-01-01
      • 2016-12-09
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多