针对域类的查询应针对实体进行解析

时间:2012-08-31 15:24:29

标签: entity-framework repository-pattern automapper iqueryable

我正在尝试构建一个允许查询域类的通用存储库。

My Repository界面如下所示:

public interface IRepository<T>
{
    T Get(int id);
    IQueryable<T> Query();
    void Add(T model);
    void Remove(T model);
} 

鉴于我有一个UserEntity实体框架类和一个User域类,我想查询UserUserEntity不应该公开给其他服务,因为它应该是Entity Framework层的内部服务。

userRepository.Query().Single(user => user.UserName == "Toni")之类的查询应返回User域类。但是在内部它应该查询从我的实体框架返回的IDbSet<UserEntity>。表达式树(包含Single查询操作)应附加到针对IDbSet<UserEntity>的查询中。查询IDbSet<UserEntity>后,我想将UserEntity转换为User域类。这可能吗?

我的目的是为我的IQueryable类强制执行User实现,该类在内部查询UserEntity

public class MappedEntityQuery<TModel, TEntity> : IQueryable<TModel>
{
}

1 个答案:

答案 0 :(得分:1)

  

Code First要求约定具有所有IDbSet属性以访问DbContext中的表

事实并非如此。如果提供映射到模型构建器中的实体,则不需要在上下文中声明任何集合。在您的情况下,您应该通过EntityTypeConfiguration<T>ComplexTypeConfiguration<T>派生类声明映射。您可以通过在上下文中调用DbSet来创建映射实体类型的任何Set<T>()实例。

  

然而,对于这个项目,我使用的是Database First方法,它也不允许使用来自不同项目的实体加载组合DbContext,因为您必须在一个元数据文件中指定数据库元数据(将嵌入)

这只是部分原因。 EDMX元数据必须位于主项目中嵌入的单个文件中,但如果您使用自己的实体类而不是自动生成,则实体类不必。所以你提议的方法应该有效。

但如果你真的想要实现模块化,就不应该使用EDMX。如果您决定在将来添加或更改任何模块,那么它也需要更改中央项目,但这会影响所有其他模块 - 它打破了模块化的想法,不是吗?