我们在ASP.NET MVC 3应用程序中使用存储库模式。这意味着,尽管我们使用EF 4.1 Code First访问后端数据,但所有MVC控制器都通过通用存储库类而不是直接通过DbContext子类来实现数据访问。
简化代码片段:
我们对每个依赖项都使用接口和依赖注入。这很好用,看起来很不错,是吧?但现在有一个警告:
我们还提供了一个WCF数据服务(支持Code First的CTP)来访问实体。我们也想在该服务中使用存储库。但这似乎有些棘手。当直接使用
细节:
我的第一次尝试是:
然而,在调用服务时,出现以下错误消息:
服务器在处理请求时遇到错误。异常消息是“在数据上下文类型'MyEntityRepository'上,存在一个顶级IQueryable属性'MyEntities',其元素类型不是实体类型。确保IQueryable属性是实体类型或在数据上下文类型上指定IgnoreProperties属性以忽略此属性。”
我尝试了以下步骤来修复它,但无法摆脱这个错误消息:
- 将[DataServiceKey("MyEntityId")]添加到MyEntity中,其中MyEntityId是实体的正确关键属性。 - 将Repository.MyEntities的类型替换为IDbSet而不是IQueryable。
简化代码片段:
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数据服务(支持Code First的CTP)来访问实体。我们也想在该服务中使用存储库。但这似乎有些棘手。当直接使用
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。
顺便提一下:以下帖子不是重复的:
IQueryable
或DbSet
属性,这仍然有效。这些升级工具可用于提问时可用的工具集,因此这似乎是无意义的。 - Marc L.