0

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

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

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

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

应用程序配置

<?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 吗?我尝试这样做的原因是表架构因解决方案而异,所以我希望类库不要担心哪些表可能存在或不存在。

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

这是一张照片,显示了一个解决方案中的项目如何引用类库 在此处输入图像描述

更新:我认为问题在于类库找不到模型

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

在调试中检查连接字符串,一切看起来都很好

4

2 回答 2

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>

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

于 2013-07-01T21:26:49.127 回答
0

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

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

于 2013-07-02T18:39:58.470 回答