Проблема с метаданными в строке подключения Entity Framework - PullRequest
3 голосов
/ 26 октября 2010

У меня есть приложение Silverlight 4, использующее RIA Services, в котором я переместил весь специфичный для RIA Services код в отдельный модуль (библиотека классов WCF RIA Services) под названием «AppServices».Назовем основное приложение «Silverlight4App».Мне нужно аутентифицировать пользователей по другой базе данных, чем база данных, где хранятся остальные данные.Я добавил модель EF в AppServices.Web, где также находится служба аутентификации.Файл Web.config находится в основном приложении, то есть в Silverlight4App.

В разделе connectionStrings файла web.config у меня изначально было следующее:

<add name="AuthEntities" connectionString="metadata=res://*/AuthModel.csdl|res://*/AuthModel.ssdl|res://*/AuthModel.msl;provider=... />

, и я получил следующую ошибку:

"Операция загрузки не выполнена для запроса'GetUser'. Невозможно загрузить указанный ресурс метаданных. "

Затем я попробовал различные вещи, такие как:

<add name="AuthEntities" connectionString="metadata=..\..\bin\AuthModel.csdl|..\..\bin\AuthModel.ssdl|..\..\bin\AuthModel.msl;provider=... />

и получил эту ошибку:

" Операция загрузкиНе удалось выполнить запрос GetUser. Указанный путь метаданных недопустим. Допустимый путь должен быть либо существующим каталогом, либо существующим файлом с расширением «.csdl», «.ssdl» или «.msl», или URI, которыйидентифицирует встроенный ресурс. "

Я также пытался копировать файлы метаданных в разные места.В итоге я немного продвинулся в следующем.

<add name="AuthEntities" connectionString="metadata=~\..\..\..\Silverlight4App.Web\Metadata\AuthModel.csdl|~\..\..\..\Silverlight4App.Web\Metadata\AuthModel.ssdl|~\..\..\..\Silverlight4App.Web\Metadata\AuthModel.msl;provider=... />

При использовании указанной выше строки подключения я получил следующую ошибку:

"Операция загрузки не выполнена для запроса 'GetUser'. Предоставленная строка подключения недопустима, поскольку содержит недостаточное отображениеили сведения о метаданных. \ r \ nИмя параметра: connectionString Внутреннее сообщение об исключении: невозможно определить контекст приложения. Не удалось определить путь приложения ASP.NET. "

Ну, по крайней мере, кажется, найдено файлов метаданных!Из-за разочарования я наконец попытался просто жестко запрограммировать весь путь к файлам метаданных:

<add name="AuthEntities" connectionString="metadata=C:\Users\...\Silverlight4App.Web\Metadata\AuthModel.csdl|C:\Users\...\Silverlight4App.Web\Metadata\AuthModel.ssdl|C:\Users\...\Silverlight4App.Web\Metadata\AuthModel.msl;provider=... />

Это сработало отлично !!К сожалению, это паршивое решение, особенно когда я собираюсь развернуть приложение.

Кажется странным, что попытка, которую я пытался сделать перед жестко закодированной попыткой (см. Выше), жаловалась на то, что было недостаточно информации, и, тем не менее, жестко закодированная попытка, указывающая на точно такие же файлы, кажется, содержит достаточно информации.Хм ...

Есть идеи?Я, конечно, мог бы использовать некоторую помощь!

Ответы [ 3 ]

2 голосов
/ 12 января 2011

Из моих экспериментов: метаданные при доступе через файловую систему создаются по относительному пути к Environment.CurrentDirectory. Если что-то меняет это значение, оно испортит ваши относительные пути, если они даны из пути exe. Из-за этого ограничения более стабильно использовать встроенный ресурс.

Примечание. При компиляции как встроенного ресурса полное имя ресурса отличается от компиляции edmx с помощью EntityDeploy. Используйте ilasm или reflector для извлечения скомпилированных ресурсов, чтобы быть уверенным в названии ресурса, если у вас все еще возникают проблемы с получением / получением метаданных ...

2 голосов
/ 27 октября 2010

Посмотрите в скомпилированной сборке с Reflector, чтобы увидеть, есть ли ресурсы; если они есть, они должны быть доступны с использованием первого метода. Если нет, то с вашим развертыванием что-то не так; у вас всегда есть возможность развернуть их как свободные файлы, конечно. Если это не поможет, попросите больше разъяснений, завтра я буду за столом с кодом для дальнейшего объяснения (мне пришлось иметь дело с чем-то подобным некоторое время назад).

1 голос
/ 27 октября 2010

Лучший способ справиться с этим - создать фабрику для производства вашего объекта EF.Фабрика может передать объект edmxconnection, который может быть сгенерирован следующим образом: (Простите за VB)

Public Shared Function GetEDMXConnectionString(Of T As ObjectContext)(Optional ByVal connectionString As String = "") As EntityConnection
  Dim dbConnection As New SqlConnection(connectionString)
  Dim resourceArray As String() = {"res://*/"}
  Dim assemblyList As Assembly() = {GetType(T).Assembly}
  Dim metaData As New MetadataWorkspace(resourceArray, assemblyList)
  Dim edmxConnection As New EntityConnection(metaData, dbConnection)

  Return edmxConnection
End Function

Это соединение затем может быть передано в экземпляр Context через конструктор.

...