存储库模式 - 如何组合数据库和内存实体?

问题描述 投票:1回答:1

我正在实现存储库模式,并允许存储库的用户对数据进行过滤,投影和排序,以便在可能的情况下在数据库级别完成。当用户添加/更新实体时,更改将在内存中进行,直到调用工作单元的Save()方法,其中所有实体都持久保存到数据库。

这是存储库中实体读取部分的接口:

class MyEntity
{
    public int ID {get;set;}
    public string Name {get;set;}
}

interface IMyEntityRepository
{        
    IEnumerable<MyEntity> Get<TProjection>(Expression<Func<MyEntity, TProjection>> projection, Expression<Func<MyEntity, object>> sorting);
}

问题是:假设存储库的用户添加了一个实体,然后尝试通过投影和排序来检索对象:

using (var uow = CreateUnitOfWork())
{
    repository.Add(new MyEntity {ID = 1, Name = "Bob"});
    var result = repository.Get(projection: entity => entity.ID, sorting: entity => entity.Name);
    uow.Save();
}

因此,在Add()之后,添加的实体仍然在内存中,因为尚未保存工作单元。现在,用户通过投影ID但按名称排序来查询实体。由于某些实体位于数据库中,而某些实体位于内存中,因此我似乎需要合并数据库中的排序和内存中对象的排序。我如何合并数据库和内存中实体,因为投影从数据库中检索的数据(仅限ID)不包括排序键(名称)?

编辑:所以我理解在这种情况下,存储库的查询实现应该忽略已添加但尚未保存的实体。但是同样的问题仍然存在于已保存但缓存在存储库中的实体。我应该如何对部分缓存的数据进行排序?

c# database caching repository-pattern unit-of-work
1个回答
2
投票

当您以这种方式添加新实体时,在运行uow.Save();之前不会发生任何实际情况。

问题在于,您无法在任何操作中使用新实体,因为您无法绝对确定它将被添加到数据库中(它可能会遗漏某些必需属性或某些外键约束)。


解决方案是首先提交工作单元,然后执行您想要的任何操作。

© www.soinside.com 2019 - 2024. All rights reserved.