У меня есть несколько решений, которые включают проект 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="data source=.SQLEXPRESS;initial catalog=TEST_DATABASE;integrated security=True;MultipleActiveResultSets=True;App=EntityFramework"" 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 в библиотеке классов? Причина, по которой я пытаюсь сделать это, заключается в том, что схема таблицы отличается от решения для решения, поэтому я бы хотел, чтобы библиотека классов не беспокоилась о том, какие таблицы могут существовать или нет.
Просто запустите сценарии обновления базы данных и создание объектов базы данных
Вот фотография, которая показывает, как проект в одно решение ссылается библиотека классов
Update: Я считаю, что этот вопрос будет, что библиотека классов не находит модель
"metadata=res://*/Model.Model.csdl|res://*/Model.Model.ssdl|res://*/Model.Model.msl;provider=System.Data.SqlClient;
Проверка ConnectionString в отладке, все выглядит нормально
Вы правы. Строка соединения отсутствует в библиотеке классов app.config. Но это было сделано специально. Библиотека классов не должна «знать» фактическую строку соединения, но получить ее из проекта, который использует DLL библиотеки классов. Или я что-то упустил? Как можно использовать библиотеку классов для разных баз данных? – Kman
Если у вас есть другая база данных, вы будете использовать другую строку соединения, для любого проекта вашего решения потребуется строка соединения, если она использует DLL – meda
. Я добавил строку подключения в библиотеку классов, но она все еще не работает. Я думаю, мы могли бы неправильно понять, как настроены мои два решения, поэтому я добавил новую фотографию, которая показывает, как они связаны – Kman