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



我正在实现存储库模式,并允许存储库的用户过滤,投影和排序数据,以便可以在可能的情况下在数据库级别完成。 当用户添加/更新实体时,更改将在内存中进行,直到调用工作单元的 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)从数据库中检索的数据不包括排序键(名称)?

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

当您以这种方式添加新实体时,在您运行uow.Save();之前,实际上什么都不会发生。

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


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

最新更新