2013-07-01 2 views
0

У меня есть несколько решений, которые включают проект Database Builder. Он читает несколько файлов сценариев и создает таблицы, представления, загружает данные и т. Д.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

Update: Я считаю, что этот вопрос будет, что библиотека классов не находит модель

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

Проверка ConnectionString в отладке, все выглядит нормально

ответ

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> 

Не забудьте перекомпилировать, чтобы увидеть изменения.

+0

Вы правы. Строка соединения отсутствует в библиотеке классов app.config. Но это было сделано специально. Библиотека классов не должна «знать» фактическую строку соединения, но получить ее из проекта, который использует DLL библиотеки классов. Или я что-то упустил? Как можно использовать библиотеку классов для разных баз данных? – Kman

+0

Если у вас есть другая база данных, вы будете использовать другую строку соединения, для любого проекта вашего решения потребуется строка соединения, если она использует DLL – meda

+0

. Я добавил строку подключения в библиотеку классов, но она все еще не работает. Я думаю, мы могли бы неправильно понять, как настроены мои два решения, поэтому я добавил новую фотографию, которая показывает, как они связаны – Kman

0

Мне не нужна строка соединения в библиотеке классов. Проблема была связана с именем модели.

Файл конфигурации для проекта, который содержит модель, имел другое имя, из-за чего модель не была найдена (даже если строка соединения была в порядке).

Смежные вопросы