0

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

我的存储库界面如下所示:

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

鉴于我有一个UserEntity实体框架类和一个User域类,我想查询User. UserEntity不应该暴露给其他服务,因为它应该在实体框架层的内部。

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

我想IQueryable为我的User类创建一个内部查询的实现UserEntity

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

1 回答 1

1

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

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

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

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

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

于 2012-09-01T22:51:28.537 回答