У меня есть первый проект кода C# ASP.NET MVC, который работает так, как и предполагалось, для подключения к моей базе данных. У него есть строка подключения, установленная в файле web.config, и все, похоже, отлично работает.
<connectionStrings>
<add name = "HorstMFGContext" connectionString = "Data Source=(LocalDb)\MSSQLLocalDB;AttachDbFilename=|DataDirectory|HorstMFG.mdf;Initial Catalog=aspnet-HorstMFG;Integrated Security=True" providerName = "System.Data.SqlClient" />
</connectionStrings>
Теперь мне нужно подключиться к той же базе данных из другого приложения, которое должно быть библиотекой классов на основе WinForms. У меня нет доступа к исходному коду программы, использующей мою dll, потому что мое приложение является просто подключаемым модулем для Autodesk Vault.
Существует множество примеров такой как этот, которые показывают, как установить строку подключения в приложении, которое вызывает dll, но в моем случае это явно не сработает.
Эта ссылка здесь кажется очень близким к тому, что мне нужно, но я не смог заставить его работать. Вот моя версия функции «Создать».
public static HorstMFGEntities Create(string nameOrConnectionString)
{
var entityBuilder = new EntityConnectionStringBuilder();
// use your ADO.NET connection string
entityBuilder.ProviderConnectionString = nameOrConnectionString;
// Set the Metadata location.
entityBuilder.Metadata = @"res://*/HorstMFG.ssdl|res://*/HorstMFG.msl";
return new HorstMFGEntities(entityBuilder.ConnectionString);
}
Вот строка, которая вызывает функцию:
using (var db = HorstMFGEntities.Create(@"data source=(localdb)\MSSQLLocalDB;attachdbfilename=C:\Users\lorne\source\repos\HorstMFG\HorstMFG\App_Data\HorstMFG.mdf;integrated security=True;MultipleActiveResultSets=True;App=EntityFramework"))
{
foreach (string l in lineList3)
{
....
....
Вот фактическая строка, которая вызывает исключение.
// calculate material
Material mat = db.Materials.Where(m => m.StructuralCode == l.Split('\t')[6]).FirstOrDefault();
Сообщение об исключении «Ошибка: ключевое слово не поддерживается: метаданные».
Любая помощь, чтобы указать мне в правильном направлении, приветствуется. Спасибо.
Я обновил свой код в соответствии с первым комментарием, а также добавил «провайдера», которого я тоже пропустил.
public static HorstMFGEntities Create(string nameOrConnectionString)
{
var entityBuilder = new EntityConnectionStringBuilder();
// use your ADO.NET connection string
entityBuilder.ProviderConnectionString = nameOrConnectionString;
entityBuilder.Provider = "System.Data.SqlClient";
// Set the Metadata location.
entityBuilder.Metadata = @"res://*/HorstMFG.csdl|res://*/HorstMFG.ssdl|res://*/HorstMFG.msl";
return new HorstMFGEntities(entityBuilder.ConnectionString);
}
Теперь я получаю сообщение об ошибке «Ошибка: невозможно загрузить указанный ресурс».
Теперь я выполнил инструкции в ссылку, которую вы предоставили.. Думаю, я уже близок к этому, но я еще немного не уверен в формате метаданных. Кажется, что в этом примере есть закомментированная часть. Я заменил это на это:
entityBuilder.Metadata = "res://*/HorstMFG.csdl|res://*/HorstMFG.ssdl|res://*/HorstMFG.msl";
Теперь я получаю сообщение об ошибке: «Не удалось загрузить указанный ресурс метаданных».
Я подтвердил, что файлы, на которые я ссылаюсь, действительно существуют, они находятся в папке ... \ obj \ Debug \ edmxResourcesToEmbed \ моего проекта. Я также изменил действие сборки для объекта HorstMFG.edmx с «Нет» на «Встроенный ресурс». Это ничего не помогло.
Коду EF они сначала не нужны.
См. Дополнительную информацию в отредактированном вопросе.
Извините, я замалчил тот факт, что вы сначала делали код ... взгляните на этот вопрос SO ... он больше соответствует тому, что вы пытаетесь сделать. stackoverflow.com/questions/25092218/…
Добавлены подробности к исходному вопросу.





Я использовал этот класс построителя соединений несколько лет назад, и я знаю, что он работает ... заметил разницу в вашем примере и в том, на который вы ссылались. В вашей версии отсутствует "Model.csdl" в мета ... почти наверняка EF требует все 3 ссылки res. Попробуйте вот так и посмотрите, работает ли это. res: //*/Model.csdl | res: //*/Model.ssdl | res: //*/Model.msl