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

标签 c# database caching repository-pattern unit-of-work

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

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

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(); 之前实际上什么都不会发生。

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


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

关于c# - 存储库模式 - 如何结合数据库和内存中的实体?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55475407/

相关文章:

c# - 使用 C# 从 Lotus Notes 电子邮件中提取/导出附件

mysql - 如果 var 等于,则进行一个查询或其他查询

node.js - 在 redis 中搜索 JSON 值

database - 实现缓存的最佳实践

c# - 如何复制html页面

c# - TCPListener C#/服务器上的多个客户端发送数据

c# - 是否可以使 Razor 部分成为可选的?

c# - MS SQL nvarchar id 字段包含空格

iphone - 使用Web服务刷新时如何知道数据是否更新

php - 删除 Laravel 中的缓存文件