我正在尝试构建一个允许查询域类的通用存储库。
My Repository界面如下所示:
public interface IRepository<T>
{
T Get(int id);
IQueryable<T> Query();
void Add(T model);
void Remove(T model);
}
鉴于我有一个UserEntity
实体框架类和一个User
域类,我想查询User
。 UserEntity
不应该公开给其他服务,因为它应该是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>
{
}
答案 0 :(得分:1)
Code First要求约定具有所有IDbSet属性以访问DbContext中的表
事实并非如此。如果提供映射到模型构建器中的实体,则不需要在上下文中声明任何集合。在您的情况下,您应该通过EntityTypeConfiguration<T>
和ComplexTypeConfiguration<T>
派生类声明映射。您可以通过在上下文中调用DbSet
来创建映射实体类型的任何Set<T>()
实例。
然而,对于这个项目,我使用的是Database First方法,它也不允许使用来自不同项目的实体加载组合DbContext,因为您必须在一个元数据文件中指定数据库元数据(将嵌入)
这只是部分原因。 EDMX元数据必须位于主项目中嵌入的单个文件中,但如果您使用自己的实体类而不是自动生成,则实体类不必。所以你提议的方法应该有效。
但如果你真的想要实现模块化,就不应该使用EDMX。如果您决定在将来添加或更改任何模块,那么它也需要更改中央项目,但这会影响所有其他模块 - 它打破了模块化的想法,不是吗?