类库中的DBContext

时间:2013-07-01 21:20:21

标签: asp.net-mvc entity-framework dbcontext

我有几个包含数据库构建器项目的解决方案。它读取许多脚本文件并创建表,视图,加载数据等。

在我需要的每个解决方案中都有一个项目副本似乎是不必要的,所以我开始将代码移到类库中,在AppSettings上有必要的脚本文件。

一切似乎工作正常,直到我运行一个使用这个新类库的项目。当我尝试运行第一个Database.SqlQuery时出现异常。检查dbContext连接字符串似乎没问题。

DatabaseBuilder - 参考类库的控制台应用程序

App.Config中

<?xml version="1.0" encoding="utf-8" ?>
<configuration>
  <startup>
    <supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.5" />
  </startup>
  <appSettings>
    <add key="Script_Startup" value="Scripts/OnStartup.txt"/>
    <add key="Script_Tables" value="Scripts/Tables.txt"/>
    <add key="Script_Views" value="Scripts/Views.txt"/>
  </appSettings>
  <connectionStrings>
    <add name="DBModelEntities" connectionString="metadata=res://*/Model.Model.csdl|res://*/Model.Model.ssdl|res://*/Model.Model.msl;provider=System.Data.SqlClient;provider connection string=&quot;data source=.SQLEXPRESS;initial catalog=TEST_DATABASE;integrated security=True;MultipleActiveResultSets=True;App=EntityFramework&quot;" providerName="System.Data.EntityClient" />
  </connectionStrings>
</configuration>

班级图书馆 - App.Config

<?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=5.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" requirePermission="false" />
  </configSections>
  <entityFramework>
    <defaultConnectionFactory type="System.Data.Entity.Infrastructure.SqlConnectionFactory, EntityFramework" />
  </entityFramework>
</configuration>

此部分显示如何创建dbContext。我检查了_model数据并将其连接到数据库。

//Class Library - Method for creating dbConext
    internal SchemaUpgrade()
    {
      _model = new DbContext("DBModelEntities");
    }

//Class Library - Method for checking if Table exists
    private bool TableExists(string tableName)
    {
      const string template = "IF EXISTS (SELECT * FROM INFORMATION_SCHEMA.TABLES " +
                              "WHERE TABLE_SCHEMA = 'dbo' AND TABLE_NAME = '{0}') " +
                              "SELECT 1 AS TABLE_EXISTS ELSE SELECT 0 AS TABLE_EXISTS;";

      var i = _model.Database.SqlQuery<int>(string.Format(template, tableName));
      return i.First() == 1;
    }

Database.SqlQuery会抛出异常,并显示以下消息:

无法加载指定的元数据资源。

类库和在每个解决方案中都有项目的旧方法之间的区别在于模型现在不是类库解决方案的一部分。

所以我猜测它可能与DbContext有关,现在没有在部分类中使用,其中定义了各种实体(public DBSet<TableName> TableName {get;set;}

是否无法在类库中使用DbContext?我尝试这样做的原因是表模式不同于解决方案,所以我希望类库不要担心哪些表可能存在或不存在。

只需运行数据库更新脚本并创建数据库对象

这是一张照片,显示了一个解决方案中的项目如何引用类库 enter image description here

更新: 我认为问题是类库没有找到模型

"metadata=res://*/Model.Model.csdl|res://*/Model.Model.ssdl|res://*/Model.Model.msl;provider=System.Data.SqlClient;

检查debug中的connectionstring,一切正常

2 个答案:

答案 0 :(得分:0)

当然可以在类库中使用DBContect,这是我目前在我的项目中所做的,我只是将它们指向DLL(类库)

我怀疑你的app.config文件缺少类库项目中的连接字符串。

添加它,它应该是相同的:

  <connectionStrings>
    <add name="DBModelEntities" connectionString="metadata=res://*/Model.Model.csdl|res://*/Model.Model.ssdl|res://*/Model.Model.msl;provider=System.Data.SqlClient;provider connection string=&quot;data source=.SQLEXPRESS;initial catalog=TEST_DATABASE;integrated security=True;MultipleActiveResultSets=True;App=EntityFramework&quot;" providerName="System.Data.EntityClient" />
  </connectionStrings>

不要忘记重新编译以查看更改。

答案 1 :(得分:0)

我不需要类库中的连接字符串。 该问题与模型的名称有关。

保存模型的项目的配置文件有另一个名称导致找不到模型(即使连接字符串没问题)。