繁体   English   中英

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

[英]Repository pattern - how to combine database & in-memory entities?

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

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

当您以这种方式添加新的Entity时,直到运行uow.Save();实际上什么也没有发生uow.Save();

问题是, 您不能在任何操作中使用新实体,因为您不能完全确定将其添加到数据库中 (它可能会缺少某些必需的属性或某些外键约束)。


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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM