[英]Entity Framework Core adding to .Net Core Web Api - IRelationalTypeMappingSource problem
[英]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.