Search code examples
c#asp.net-identity-2

How to perform addition, update operation on extra table in identity server?


I have added the following UserLog table in the database using asnetidentity but i don't know how to perform add,update operation on the table.

public class User : IdentityUser
{

    public virtual ICollection<UserLog> UserLogs { get; set; }

}
public class Context : IdentityDbContext<User, Role, string, IdentityUserLogin, IdentityUserRole, IdentityUserClaim>
{
    public Context(string connString)
        : base(connString)
    {
    }
}
public class UserLog
{
    [Key]
    public Guid UserLogID { get; set; }

    public string IPAD { get; set; }
    public DateTime LoginDate { get; set; }
    public string UserId { get; set; }

    [ForeignKey("UserId")]
    public virtual ApplicationUser User { get; set; }
}

public System.Data.Entity.DbSet<UserLog> UserLog { get; set; }

Like in the following code, I am using inbuilt methods of these aspnetidentity tables but how to add an entry in the "UserLog" table when user login every time in the following method?

public override async Task AuthenticateLocalAsync(LocalAuthenticationContext ctx)
{
    var username = ctx.UserName;
    var password = ctx.Password;
    var message = ctx.SignInMessage;

    ctx.AuthenticateResult = null;

    if (userManager.SupportsUserPassword)
    {
        var user = await FindUserAsync(username);
        if (user != null)
        {
            if (userManager.SupportsUserLockout &&
                await userManager.IsLockedOutAsync(user.Id))
            {
                return;
            }

            if (await userManager.CheckPasswordAsync(user, password))
            {
                if (userManager.SupportsUserLockout)
                {
                    await userManager.ResetAccessFailedCountAsync(user.Id);
                }

                var result = await PostAuthenticateLocalAsync(user, message);
                if (result == null)
                {
                    var claims = await GetClaimsForAuthenticateResult(user);
                    result = new AuthenticateResult(user.Id.ToString(), await GetDisplayNameForAccountAsync(user.Id), claims);
                }

                ctx.AuthenticateResult = result;
            }
            else if (userManager.SupportsUserLockout)
            {
                await userManager.AccessFailedAsync(user.Id);
            }
        }
    }
}

Solution

  • Step 1: Create an instance of UserLog

    var userLog = new UserLog() { /* Set value for all the properties here */ };
    

    Step 2: Add instance of UserLog to DbContext

    context.Set<UserLog>().Add(userLog);
    

    Step 3: Call DbContext.SaveChanges() to save changes to database.

    context.SaveChanges();
    

    Complete source code will looks like:

    var userLog = new UserLog {
        UserLogID = Guid.NewGuid(),
        IPAD = "Some Value",
        LoginDate = DateTime.Now,
        UserId = "User Id Here"
    };
    var context = new Context();
    context.Set<UserLogs>().Add(userLog);
    context.SaveChanges();