繁体   English   中英

如何在 Blazor 和 Web API 和一个 ZEFE90A8E604A7C840E888D03A 中使用 Entity Framework Core

[英]How to use Entity Framework Core in Blazor and Web API with one package

I want to build an app which provides web side (Blazor) and app side (Android, iOs, etc which use Web API communication). 我想使用 EF Core 来存储我的数据。

Blazor 和 Web API 的流程类似。 所以我想将它与一个 package 一起使用。 有没有办法实现它?

数据层示例,使用 DI

public class UserService : IUserService
{
    private SqlContext db;
    private IDbContextFactory<SqlContext> dbContextFactory;

    public UserService(SqlContext sqlContext, IDbContextFactory<SqlContext> dbContextFactory)
    {
        this.db = sqlContext;
        this.dbContextFactory = dbContextFactory;
    }

    public async Task Add(UserDTO userDTO, UserType Type)
    {
        var u = await db.Users.Where(u => u.Id == userDTO.Id).AsNoTracking().FirstOrDefaultAsync();

        if (u is not null)
        {
            throw new("same ID");
        }

        userDTO.Type = Type;
        var entity = userDTO.MapTo<UserEntity>();
        entity.Type = Type;

        await db.AddAsync(entity);
        await db.SaveChangesAsync();
    }

    public async Task UpdatePassword(string userId, string password)
    {
        var user = await db.Users
                           .SingleAsync(u => u.Id == userId);

        if (password != "")
        {
            user.Password = password.ToSHA512();
        }

        await db.SaveChangesAsync();
    }
}

它在 Web API 中运行良好,但在 Blazor 中运行良好。

Blazor样品

@inject IUserService userService

<SpaceItem><Button Icon="@IconType.Outline.Redo" OnClick="()=>ResetPwd(context.Id)">resetPass</Button></SpaceItem>

    public async Task ResetPwd(string id)
    {
      var pwd = id.Substring(id.Length - 6);
      await userService.UpdatePassword(id, pwd);
    }

有一个问题,当我打开Blazor页面,用API修改密码,然后用Blazor重置密码,数据库响应中的密码是最后一个密码。

https://learn.microsoft.com/en-us/aspnet/core/blazor/blazor-server-ef-core?view=aspnetcore-6.0

我看到 dbcontextFactory,当我执行它时,我每次都需要创建。 我需要在每个函数中添加一个代码。

有什么好的方法可以获取吗?

首先,您不应该从 blazor 应用程序调用服务方法。 Blazor 应该通过 API 与服务和数据库通信。 (您可以使用“改装”来维护来自 blazor 的 API 调用)

也许这是给问题,因为您在 blazor 中没有 SqlContext 和 DbContetFactory ,就像在 API 中一样,但该服务期望它们作为注入。

首先,使用“工作单元”Db 上下文,您的UserService应该看起来像这样 - 请参阅这篇 MS 文章了解原因 - https://learn.microsoft.com/en-us/ef/core/dbcontext-configuration/#using-a -dbcontext-factory-eg-for-blazor

public class UserService : IUserService
{
    private IDbContextFactory<SqlContext> dbContextFactory;

    public UserService(IDbContextFactory<SqlContext> dbContextFactory)
    {
        this.dbContextFactory = dbContextFactory;
    }

    public async Task Add(UserDTO userDTO, UserType Type)
    {
        using db = this.dbContextFactory..CreateDbContext();
        //....
    }

    public async Task UpdatePassword(string userId, string password)
    {
        using db = this.dbContextFactory..CreateDbContext();
        //....
    }
}

您的第二个问题几乎可以肯定是并发问题。 当您通过 API 进行更新时,您似乎已经获得了 Blazor 中的信息。 没有更多信息,很难具体说明。

暂无
暂无

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

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