Мы используем шаблон репозитория в нашем приложении ASP.NET MVC 3. Это означает, что, хотя мы используем EF 4.1 Code First для доступа к данным в бэкэнде, все контроллеры MVC делают это через общий класс репозитория, а не напрямую через подкласс DbContext.
Упрощенный фрагмент кода:
public class MyEntityContext : DbContext, IMyEntityContext
{
public IDbSet MyEntities { get; set; }
...
}
public class MyEntityRepository : IMyEntityRepository
{
private IMyEntityContext _context;
public IQueryable<MyEntity> MyEntities
{
return _context.MyEntities;
}
...
}
public class MyEntityController : Controller
{
private MyEntityRepository _repository;
...
}
Мы используем интерфейсы и внедрение зависимостей для каждой зависимости. Работает нормально. Выглядит хорошо, не так ли? Но теперь для предостережения:
Мы также предоставляем Службу данных WCF (CTP, поддерживающий Code First) для доступа к объектам. Мы хотим использовать репозиторий и в этом сервисе. Но это кажется сложным. При прямом использовании MyEntityContext
услуга выглядит следующим образом:
public class MyEntityService : DataService<MyEntityContext>
{
public static void InitializeService(DataServiceConfiguration config)
{
config.SetEntitySetAccessRule("MyEntities", EntitySetRights.All);
}
}
Но когда я пытаюсь заменить MyEntityContext
на хранилище, возникают две проблемы:
- Тип, указанный для универсального
DataService<..>
, должен быть классом с конструктором по умолчанию, который нарушает симпатичный дизайн по контракту и дизайн внедрения зависимостей.
- Даже кажется, что предоставленный тип должен быть классом
DbContext
: я пробовал и использовал MyEntityRepository
вместо этого, но не смог (см. Подробности).
Кажется, я потерян ... Кто-нибудь может вернуть меня на правильный путь?
подробности:
Мой первый путь был:
public class MyEntityService : DataService<MyEntityRepository>
{
...
Однако при вызове службы происходит сбой со следующим сообщением об ошибке:
Сервер обнаружил ошибку при обработке запроса. Сообщение об исключении: «В типе контекста данных« MyEntityRepository »имеется верхнее свойство IQueryable« MyEntities », тип элемента которого не является типом объекта. Убедитесь, что свойство IQueryable относится к типу сущности, или укажите атрибут IgnoreProperties для типа контекста данных, чтобы игнорировать это свойство. '.
Я попытался выполнить следующие шаги, чтобы исправить это, но не избавился от этого сообщения об ошибке:
- Добавление
[DataServiceKey("MyEntityId")]
в MyEntity, где MyEntityId - правильное ключевое свойство сущности.
- Замена типа
Repository.MyEntities
на IDbSet
вместо IQueryable
.
Кстати: следующие сообщения не дубликаты: