OData в многоуровневой архитектуре MVC3 EF

#wcf #asp.net-mvc-3 #entity-framework #odata

#wcf #asp.net-mvc-3 #entity-framework #odata

Вопрос:

Я абсолютный новичок в материалах, связанных с WCF, поэтому простите мой наивный вопрос, но я не уверен, с чего начать точное определение ошибки при изучении основ OData.

У меня есть существующее приложение MVC3, использующее базу данных, использующее поставщика универсального членства (добавленного через nuget) и небольшую базу данных SDF, доступ к которой осуществляется через SQL Server Compact Edition Client Data Provider 4.0. Я создал ее, выполнив следующие шаги:

1) создайте новый проект библиотеки для уровня данных, добавьте EDMX из базы данных, затем добавьте ADO.NET Шаблоны для создания контекста базы данных и объектов.

2) создайте новый проект библиотеки для общих интерфейсов данных: интерфейс репозитория, реализованный в (1), и шаблон entities t4 с его выводом, перенесенный из (1) в этот проект (изменив параметр TT inputFile таким образом, чтобы он ссылался на EDMX в другом проекте).

3) создайте новое приложение MVC, которое использует Ninject для создания экземпляра универсального репозитория, объявленного в (2), с репозиторием на основе SDF, реализованным в (1).

Веб-приложение работает нормально, и я могу просматривать и редактировать данные. Теперь я должен предоставить некоторые из его функций через службу WCF, и для этого я искал OData. Итак, я добавил новую службу передачи данных WCF и изменил сгенерированный код просто для его тестирования, добавив имя моего класса сущностей (как реализовано в (1)) и имя набора сущностей, например:

 public class ProjectService : DataService<OrganizerEntities>
{
    public static void InitializeService(DataServiceConfiguration config)
    {
        config.SetEntitySetAccessRule("Projects", EntitySetRights.AllRead);
        config.DataServiceBehavior.MaxProtocolVersion = DataServiceProtocolVersion.V2;
    }
}
  

В любом случае, когда я открываю SVC в браузере, я получаю ошибку запроса: сервер столкнулся с ошибкой при обработке запроса. Более подробную информацию смотрите в журналах сервера.. Если я посмотрю на журнал, я прежде всего увижу предупреждение вроде:

… http://msdn.microsoft.com/it-IT/library/System .ServiceModel.EvaluationContextNotFound.aspx Контекст оценки конфигурации не найден. …

и затем возникает исключение ArgumentNullException, подробности которого следуют ниже. Во всех примерах или руководствах, которые я нашел, я вижу типичный пример из не очень реального мира, где уровень данных не отделен от потребительского приложения: создайте новое приложение MVC, добавьте EDMX, добавьте службу данных WCF, измените несколько строк сгенерированного кода, и все волшебным образом заработает :). Итак, я полагаю, что это связано с моей многоуровневой архитектурой, особенно из-за предупреждения об отсутствии контекста. Может ли кто-нибудь помочь в использовании этой службы в многоуровневом сценарии, подобном этому? Спасибо!

… Значение не может быть нулевым. Имя параметра: ключ в системе.Коллекции.Общий.Словарь 2.FindEntry(TKey
key) at System.Collections.Generic.Dictionary
2.get_Item (ключ TKey) в System.Data.Services.Поставщики.ObjectContextServiceProvider.PopulateMetadata (идентификатор 2
knownTypes, IDictionary
2 дочерних типа, идентификатор 2 entitySets) at
System.Data.Services.Providers.BaseServiceProvider.PopulateMetadata()
at System.Data.Services.DataService
1.CreateProvider() в System.Data.Services.Служба данных 1.HandleRequest() at
System.Data.Services.DataService
1.ProcessRequestForMessage(потоковое сообщение) в SyncInvokeProcessRequestForMessage(объект , Object[] , Объект[]) в системе.ServiceModel.Диспетчер.SyncMethod Invoker.Вызов (экземпляр объекта, входные данные объекта [], объект[] и выходные данные) в системе.ServiceModel.Диспетчер.Время выполнения диспетчерской операции.Запуск вызова (MessageRpc amp; rpc) в системе.ServiceModel.Диспетчер.Неизменяемое время выполнения.ProcessMessage5 (MessageRpc amp; rpc) в системе.ServiceModel.Диспетчер.Неизменяемое время выполнения.ProcessMessage41 (MessageRpc amp; rpc) в системе.ServiceModel.Диспетчер.Неизменяемое время выполнения.ProcessMessage4 (MessageRpc amp; rpc) в системе.ServiceModel.Диспетчер.Неизменяемое время выполнения.ProcessMessage31 (MessageRpc amp; rpc) в системе.ServiceModel.Диспетчер.Неизменяемое время выполнения.ProcessMessage3 (MessageRpc amp; rpc) в системе.ServiceModel.Диспетчер.Неизменяемое время выполнения.ProcessMessage2 (MessageRpc amp; rpc) в системе.ServiceModel.Диспетчер.Неизменяемое время выполнения.ProcessMessage11 (MessageRpc amp; rpc) в системе.ServiceModel.Диспетчер.Неизменяемое время выполнения.ProcessMessage1 (MessageRpc amp; rpc) в системе.ServiceModel.Диспетчер.MessageRpc.Process(логический набор isOperationContextSet) Система.Исключение ArgumentNullException: значение не может быть нулевым. Имя параметра: ключ в системе.Коллекции.Общий.Словарь 2.FindEntry(TKey key) at
System.Collections.Generic.Dictionary
2.get_Item (ключ TKey) в System.Data.Services.Поставщики.ObjectContextServiceProvider.PopulateMetadata (идентификатор 2
knownTypes, IDictionary
2 дочерних типа, идентификатор 2 entitySets) at
System.Data.Services.Providers.BaseServiceProvider.PopulateMetadata()
at System.Data.Services.DataService
1.CreateProvider() в System.Data.Services.DataService 1.HandleRequest() at
System.Data.Services.DataService
1.Обработайте запрос формы сообщения (Stream MessageBody) в SyncInvokeProcessRequestForMessage(Object , Object[] , Объект[] ) в системе.ServiceModel.Диспетчер.SyncMethod Invoker.Вызов (экземпляр объекта, входные данные объекта [], объект[] и выходные данные) в системе.ServiceModel.Диспетчер.Время выполнения диспетчерской операции.Запуск вызова (MessageRpc amp; rpc) в системе.ServiceModel.Диспетчер.Неизменяемое время выполнения.ProcessMessage5 (MessageRpc amp; rpc) в системе.ServiceModel.Диспетчер.Неизменяемое время выполнения.ProcessMessage41 (MessageRpc amp; rpc) в системе.ServiceModel.Диспетчер.Неизменяемое время выполнения.ProcessMessage4 (MessageRpc amp; rpc) в системе.ServiceModel.Диспетчер.Неизменяемое время выполнения.ProcessMessage31 (MessageRpc amp; rpc) в системе.ServiceModel.Диспетчер.Неизменяемое время выполнения.ProcessMessage3 (MessageRpc amp; rpc) в системе.ServiceModel.Диспетчер.Неизменяемое время выполнения.ProcessMessage2 (MessageRpc amp; rpc) в системе.ServiceModel.Диспетчер.Неизменяемое время выполнения.ProcessMessage11 (MessageRpc amp; rpc) в системе.ServiceModel.Диспетчер.Неизменяемое время выполнения.ProcessMessage1 (MessageRpc amp; rpc) в системе.ServiceModel.Диспетчер.MessageRpc.Процесс (логический isOperationContextSet) …

Ответ №1:

Возможно, это не лучшее решение, но вот как мне удалось создать слой с EF и WCF:

  1. Создайте свой проект приложения MVC.

  2. Создайте новый проект веб-приложения, добавьте в этот проект свои модели сущностей и службы WCF. Отредактируйте события post build, чтобы скопировать соответствующие библиотеки dll из вашего bin / вместе с вашими файлами .svc в ваш проект MVC.

  3. Создайте свой проект библиотеки, добавьте ссылки на свои службы. Используйте эту библиотеку из вашего приложения MVC. Убедитесь, что вы используете путь к файлу MVC .svc при создании экземпляров контекстов.