【问题标题】:How to retain data gained from multiple requests in EF Core?如何在 EF Core 中保留从多个请求中获得的数据?
【发布时间】:2020-02-10 10:20:12
【问题描述】:

我有带有 React 客户端的 asp.net core web api。我正在通过在 React 中创建的用户界面添加数据。在我的 api 中,Db 上下文作为范围服务添加,每次我的请求完成并启动新的请求时,我之前请求的所有数据都会丢失。 这就是我的配置服务的样子:

 services.AddDbContext<TicketingContext>(o=>o.UseLazyLoadingProxies().UseSqlServer(connectionString));

用于发布数据的控制器方法如下所示:

 [HttpPost("{id}/tickets")]
    public IActionResult CreateNewTicket(string id,
        [FromBody] TicketForCreationDto ticketForCreation)
    {
        if (ticketForCreation == null)
        {
            return BadRequest();
        }

        var ticketEntity = _mapper.Map<Ticket>(ticketForCreation);
        _ticketRepository.AddNewTicket(ticketEntity);
        _ticketRepository.AddTicketToClient(id, ticketEntity);
        if (!_ticketRepository.Save())
        {
            throw new Exception("Creating ticket failed on save");
        }

        var ticketToReturn = _mapper.Map<TicketDto>(ticketEntity);



        return CreatedAtRoute("GetTicket", new {id=id, ticketId = ticketToReturn.Id }, ticketToReturn);
    }

和存储库中的方法如下: 添加新票:

  public void AddNewTicket(Ticket ticket)
    {
        if (ticket.Id == Guid.Empty)
        {
            ticket.Id = Guid.NewGuid();
        }

        var dispatcher = AssignTicketToDispatcher(ticket);
        if (dispatcher == null)
        {
            throw new Exception("There are no dispatchers matching this ticket");
        }

        dispatcher.UserTickets.Add(new UserTicket()
        {
            IdentityUser = dispatcher,
            Ticket = ticket,
            UserId = dispatcher.Id,
            TicketId = ticket.Id
        });


        _context.Tickets.Add(ticket);
    }

AddTicketToClient:

  public void AddTicketToClient(string id, Ticket ticket)
    {
        var client = _identityUserRepository.GetClient(id);
        if (client == null)
        {
            client = _context.Users.Where(u => u.UserName == "username").FirstOrDefault();
        }
        client.UserTickets.Add(new UserTicket()
        {
            IdentityUser = client,
            Ticket = ticket,
            UserId = client.Id,
            TicketId = ticket.Id
        });
    }

保存:

 public bool Save()
    {
        return (_context.SaveChanges() >= 0);
    }

我希望能够存储通过多个请求获得的数据。 有谁知道如何做到这一点?

【问题讨论】:

  • 我们需要从你的控制器中查看代码
  • 您始终可以选择使用会话,但一般来说,在这种情况下使用服务器资源来跟踪更改并不是一个好主意。在简单的购物篮、列表编辑/批量编辑、完成向导等场景中,您可以在客户端跟踪更改。
  • 我编辑了帖子并添加了负责将数据添加到数据库的控制器和存储库的一部分。
  • @kika123 在 all 服务中,数据存储在数据库中,在调用之间不保留在 RAM 中。这就是允许将服务部署在多个服务器上并进行负载平衡、打包在 Docker 容器等中的原因。这适用于 Nodejs 和 ASP.NET。 DbContext 用于在请求期间保存数据,然后将其全部存储在数据库中。 一些需要重用的数据可以被缓存 - 同样所有堆栈都提供了一种缓存数据的方法。

标签: c# asp.net-core dbcontext ef-core-2.1


【解决方案1】:

使用数据库,因为它是保存数据的最佳方法。

因此,当您发出请求时 - 在请求结束时,保存最新数据后 - 从之前的请求中查询您需要的数据并将其返回。

例如检索最新保存的最后 5 个请求(其中 id 是您的主键字段的示例):

var latestSaved = _context.UserTickets.OrderByDescending(x => x.id).Take(5);

或修改以返回所有相关数据,例如通过传递存储客户端的用户 ID 来激活用户。

传递您请求相关数据所需的任何参数。 使用在您的实体中设置的连接/包含。无论您需要做什么 - 利用您的实体关系从数据库中获取您需要的内容。为什么要尝试复制它已经做的事情? :)

【讨论】:

  • 感谢您的时间和回答 :) 我做了所有这些,并且在每个请求期间一切正常。但是我想通过每个新请求来实现这一点,我可以从以前的请求/以前的请求中获取数据。我认为也许在我的配置服务中添加 dbcontext 作为单例服务会使事情变得正确,但后来我读到这是不好的做法,所以我没有尝试。有没有办法在 MyContext 类中设置它?
  • 单例的问题在于它是单例 - 不是每个用户。在后端 API 中维护状态是很糟糕的(除此之外,并非所有客户端都可以发送会话 cookie,而且超时处理不好)。您的 2 个存储端是数据库和浏览器(即无需一遍又一遍地请求相同的数据)。 IE。您可以对票进行编号并仅发送新票,而不是所有票 - 用户客户端正在记住用户仍然看到哪些票。在那里擦除数据毫无意义。
  • 不是单例,保持范围。只需根据需要查询。
猜你喜欢
  • 1970-01-01
  • 2014-10-27
  • 2016-11-25
  • 1970-01-01
  • 2020-05-26
  • 1970-01-01
  • 2013-10-26
  • 1970-01-01
  • 2018-02-03
相关资源
最近更新 更多