簡體   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