EntityFramework MariaDb 的核心,SaveChanges 不会 return 生产环境中的 Id

EntityFramework Core with MariaDb, SaveChanges won't return Id in Production

我有一个 .net core 3.1 web api,我用 n 层架构构建了它。我使用 EntityFramwork 进行数据库操作。在我的本地环境中,我使用 sql 服务器进行 dbcontext 配置,下面的代码非常有效。

namespace Core.DataAccess.EntityFramework
{
    public class EfEntityRepositoryBase<TEntity,TContext>: IEntityRepository<TEntity>
        where TEntity: class, IEntity, new()
        where TContext : DbContext,new()
    {
        public void Add(TEntity entity)
        {
            using (TContext context = new TContext())
            {
                var addedEntity = context.Entry(entity);
                addedEntity.State = EntityState.Added;
                 context.SaveChangesAsync();
            }
        }

        public async Task AddAsync(TEntity entity)
        {
            using (TContext context = new TContext())
            {
                var addedEntity = context.Entry(entity);
                addedEntity.State = EntityState.Added;
                await context.SaveChangesAsync();
            }
        }
    }
}

这是我的 CRUD 操作基础 class。在我的经理中,我这样使用:

public async Task<IDataResult<int>> AddGetId(GameAd gameAd)
        {
            await _gameAdDal.AddAsync(gameAd);
            return new SuccessDataResult<int>(gameAd.Id);
        }

这工作得很好。我正在获取 id 值,我可以 return 将 Id 值发送给客户端以进行其他操作。但是我不得不将 Sql 服务器实现转换为 MariaDB。我的生产环境适用于此。现在每次我尝试添加一些东西并获取它的 Id 时,它 returns 500 错误。我尝试使用 async Task<int> AddAsync(TEntity entity) 并在其正文中使用

 public async Task<int> AddAsync(TEntity entity)
        {
            using (TContext context = new TContext())
            {
                var addedEntity = context.Entry(entity);
                addedEntity.State = EntityState.Added;
                context.SaveChanges();

                var value = addedEntity.GetDatabaseValues().GetType().GetProperty("Id").GetValue(entity, null);
                return (int)value;
            }
        }

我花了过去 3 天的时间来解决这个问题,但没有成功。我几乎阅读了所有与此相关的帖子和​​文档,但我真的想不通。我尝试从基础 class returning 实体参数,然后 returning 实体和管理器 class 的 id 值,但这些也不起作用。简而言之,我只需要使用 ef core 将一个实体插入到我的 MariaDB 数据库中(我使用 Pomelo 包来正确配置 dbcontext。我还按照文档中的建议卸载了 Microsoft.EntityFramwork.Core。)随时询问更多信息。

ps。我也有 log4net 的问题,它既不记录到数据库也不记录文件,所以我删除了它,现在尝试添加 Serilog。如果你问我怎么知道 500 的问题在于这个操作我的答案是当用户尝试注册时,我检查业务规则,如果没有匹配的用户名或电子邮件注册触发并将对象发送到 _userService.AddGetId(user) 像这样,之后有一些操作需要添加用户的 Id 作为 属性 值。当我检查我的用户 table 时,我可以看到新创建的用户具有所有正确的信息,但其他 table 只是空的。

这只是一个缺失的依赖项。我在本地重现了这个问题,发现是我忘记注入walletService了。这就是它抛出 500 的原因。异步操作 returns id 就好了。