【问题标题】:How can I return my entity, after it has been inserted into the database?将实体插入数据库后,如何返回它?
【发布时间】:2020-07-22 14:55:29
【问题描述】:

我为解决方案用户使用模型类,并使用身份来控制登录等。

因此,要创建身份用户,我需要先创建应用程序用户。 我怎样才能返回这个实体?或者,如何返回创建的 Id?

在我的班级结构之下

授权控制器

 public class AuthControllerController : MainController
    {

        private readonly SignInManager<IdentityUser> _signInManager;
        private readonly UserManager<IdentityUser> _userManager;
        private readonly AppSettings _appSettings;
        private readonly IUserSolutionService _userSolutionService;
        private readonly IUserSolutionRepository _userSolutionRepo;
        private readonly IMapper _mapper;

        public AuthControllerController(IUserIdentity userIdentity,
                                        SignInManager<IdentityUser> signInManager,
                                        UserManager<IdentityUser> userManager,
                                        IOptions<AppSettings> appSettings,
                                        IUserSolutionService userSolutionService,
                                        IUserSolutionRepository userSolutionRepo,
                                        IMapper mapper) : base(userIdentity)
        {
            _signInManager = signInManager;
            _userManager = userManager;
            _appSettings = appSettings.Value;
            _userSolutionService = userSolutionService;
            _userSolutionRepo = userSolutionRepo;
            _mapper = mapper;
        }

        [HttpPost("register")]
        public async Task<ActionResult> Registrar(UserSolutionViewModel registerUser)
        {
            if (!ModelState.IsValid) return BadRequest("Há itens faltando");

            var returnOfRegisterUser = someMethodToReturnId(); //How to do this?

            var user = new IdentityUser()
            {
                Id = registerUser.Id.ToString(), //return the Id of User of App
                UserName = registerUser.Email, //não precisa ser o email, mas, por padrao deixaremos ser o email
                Email = registerUser.Email,
                EmailConfirmed = true //pode ser false e ter a confirmação de email em algum lugar.                

            };            

            var result = await _userManager.CreateAsync(user, registerUser.Password);

            if (result.Succeeded)
            {
                await _signInManager.SignInAsync(user, false); //FALSE neste parametro é se quer persistir esse login
                //return CustomResponse(GerarJwtClaimsAndUser(user.Email)); // este metodo retorna mais dados do usuário e não somente o Token
                //return CustomResponse(GerarJwt());//caso seja necessário gerar o token com as claims, usar o outro método - linha abaixo - 
                return  Ok(GerarJwt());
            }

            return Ok(registerUser);
        }        
}

界面:

public interface IUserSolutionRepository : IRepository<UserSolution>
{       
    Task<UserSolution> GetUserByEmail(string email);
    Task<UserSolution> GetUserByPhone(string countryCode, string areaCode, string phone);
    Task<UserSolution> GetUser(Guid id);
    Task<UserSolution> GetUserAddress(Guid id);
    Task<UserSolution> AddUserSolution(UserSolution user);

}

回购:

 public class UserSolutionRepository : Repository<UserSolution>, IUserSolutionRepository
    {
        public UserSolutionRepository(SolutionDbContext context) : base(context)
        {
            
        }

        ......

        public async Task<UserSolution> AddUserSolution(UserSolution user)
        {
            //Can I return here????
        }
    }
}

一旦将用户添加到数据库中,我相信,只需要在数据库中生成的 Id 即可插入 Identity。 感谢您的帮助。

【问题讨论】:

  • 试过退货了吗?如果是:发生了什么 - 如果不是:为什么不呢?
  • 我没有尝试过,因为我不知道如何。 return user添加到数据库后就可以了?
  • 看到了吗?你确实知道怎么做。在你问这个问题的时间里,你可能已经测试了几十次;)

标签: c# asp.net-core entity-framework-6 asp.net-identity


【解决方案1】:

如果您使用 DB 生成的Ids(如IDENTITY),Id 将在SaveChangesAsync() 之后为您自动填充:

    public async Task<IActionResult> Create(User user)
    {
        int id = user.Id; // id is 0

        _context.Add(user); 
        await _context.SaveChangesAsync();

        id = user.Id;     // Yes, it has value  
        return View(user);
    }

当使用自动生成的Ids 时,实体框架默认遵循每个INSERTSELECT SCOPE_IDENTITY()

测试截图

插入用户之前

插入用户后

【讨论】:

  • 谢谢。这对我有很大帮助。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-05-09
  • 1970-01-01
  • 2021-07-30
  • 2021-02-10
  • 2015-10-28
  • 2019-01-04
相关资源
最近更新 更多