.NET Core Invalid Object Name 'ApplicationUsers' When logging in

0

This is my login function:

LoginViewModel lvm = new LoginViewModel
{
    UserName = Input.UserName,
    Password = Input.Password,
    RememberMe = Input.RememberMe
};
var valid = accountsData.Authenticate(lvm);
if (valid != null)
{
    var avm = applicationUsersData.GetByUsername(Input.UserName);
    var user = applicationUsersData.Get(avm.Id);
    var roles = userRolesData.GetUserRoles(user.Id);
    claims.Add(new Claim(ManagementStudio.ClassLibrary.Globals.CookieGlobals.UserName, user.UserName));
    claims.Add(new Claim(ManagementStudio.ClassLibrary.Globals.CookieGlobals.Email, user.Email));
    claims.Add(new Claim(ManagementStudio.ClassLibrary.Globals.CookieGlobals.PhoneNumber, user.PhoneNumber));
    claims.Add(new Claim(ManagementStudio.ClassLibrary.Globals.CookieGlobals.FirstName, user.FirstName));
    claims.Add(new Claim(ManagementStudio.ClassLibrary.Globals.CookieGlobals.LastName, user.LastName));
    claims.Add(new Claim(ManagementStudio.ClassLibrary.Globals.CookieGlobals.Id, user.Id));
    foreach (var item in roles)
    {
        var currentItem = new UserRoleDetailsViewModel
        {
            Id = item.Id,
            Name = item.Name,
            ApplicationId = item.ApplicationId,
            ApplicationName = item.ApplicationName
        };
        var convertedItem = JsonConvert.SerializeObject(currentItem);
        claims.Add(new Claim(ManagementStudio.ClassLibrary.Globals.CookieGlobals.Roles, convertedItem));
    }
    await _customClaimsCookieSignInHelper.SignInUserAsync(user, Input.RememberMe, claims);
    activityLogger.Log(HttpContext, user.Id, configuration[DSCASGlobals.DS_Name], configuration[DSCASGlobals.DS_Id], Input.UserName + " logged in");
    return LocalRedirect(returnUrl);
}

accountsData.Authenticate is located in a referenced dll assembly called ManagementStudio.Data and looks like this:

[AllowAnonymous]
public ApplicationUsers Authenticate(LoginViewModel Input)
{
    PasswordHasher<ApplicationUsers> passwordHasher = new PasswordHasher<ApplicationUsers>();
    ApplicationUsers user = new ApplicationUsers();
    try
    {
        user = dbContext.ApplicationUsers.SingleOrDefault(u => u.Email == Input.UserName);
        if(user != null)
        {
            if (passwordHasher.VerifyHashedPassword(user,user.PasswordHash,Input.Password) == PasswordVerificationResult.Success)
            {
                return user;
            }
            else
            {
                return null;
            }
        }
    }
    catch(Exception e)
    {
        logger.LogError(e, LoggingGlobals.Error);
        return null;
    }
    return user;
}

When I run the application and login, I get this error:

An exception occurred while iterating over the results of a query for context type 'ManagementStudio.Data.Models.ManagementStudioDbContext'. System.Data.SqlClient.SqlException (0x80131904): Invalid object name 'ApplicationUsers'. at System.Data.SqlClient.SqlConnection.OnError(SqlException exception, Boolean breakConnection, Action1 wrapCloseInAction) at System.Data.SqlClient.SqlInternalConnection.OnError(SqlException exception, Boolean breakConnection, Action1 wrapCloseInAction) at System.Data.SqlClient.TdsParser.ThrowExceptionAndWarning(TdsParserStateObject stateObj, Boolean callerHasConnectionLock, Boolean asyncClose) at System.Data.SqlClient.TdsParser.TryRun(RunBehavior runBehavior, SqlCommand cmdHandler, SqlDataReader dataStream, BulkCopySimpleResultSet bulkCopyHandler, TdsParserStateObject stateObj, Boolean& dataReady) at System.Data.SqlClient.SqlDataReader.TryConsumeMetaData() at System.Data.SqlClient.SqlDataReader.get_MetaData() at System.Data.SqlClient.SqlCommand.FinishExecuteReader(SqlDataReader ds, RunBehavior runBehavior, String resetOptionsString) at System.Data.SqlClient.SqlCommand.RunExecuteReaderTds(CommandBehavior cmdBehavior, RunBehavior runBehavior, Boolean returnStream, Boolean async, Int32 timeout, Task& task, Boolean asyncWrite, SqlDataReader ds) at System.Data.SqlClient.SqlCommand.RunExecuteReader(CommandBehavior cmdBehavior, RunBehavior runBehavior, Boolean returnStream, TaskCompletionSource1 completion, Int32 timeout, Task& task, Boolean asyncWrite, String method) at System.Data.SqlClient.SqlCommand.ExecuteReader(CommandBehavior behavior) at System.Data.SqlClient.SqlCommand.ExecuteDbDataReader(CommandBehavior behavior) at System.Data.Common.DbCommand.ExecuteReader() at Microsoft.EntityFrameworkCore.Storage.Internal.RelationalCommand.Execute(IRelationalConnection connection, DbCommandMethod executeMethod, IReadOnlyDictionary2 parameterValues) at Microsoft.EntityFrameworkCore.Storage.Internal.RelationalCommand.ExecuteReader(IRelationalConnection connection, IReadOnlyDictionary2 parameterValues) at Microsoft.EntityFrameworkCore.Query.Internal.QueryingEnumerable1.Enumerator.BufferlessMoveNext(DbContext _, Boolean buffer) at Microsoft.EntityFrameworkCore.SqlServer.Storage.Internal.SqlServerExecutionStrategy.Execute[TState,TResult](TState state, Func3 operation, Func3 verifySucceeded) at Microsoft.EntityFrameworkCore.Query.Internal.QueryingEnumerable1.Enumerator.MoveNext() at System.Linq.Enumerable.SingleOrDefault[TSource](IEnumerable1 source) at Microsoft.EntityFrameworkCore.Query.Internal.LinqOperatorProvider.ResultEnumerable1.GetEnumerator() at Microsoft.EntityFrameworkCore.Query.Internal.LinqOperatorProvider._TrackEntities[TOut,TIn](IEnumerable1 results, QueryContext queryContext, IList1 entityTrackingInfos, IList1 entityAccessors)+MoveNext() at Microsoft.EntityFrameworkCore.Query.Internal.LinqOperatorProvider.ExceptionInterceptor1.EnumeratorExceptionInterceptor.MoveNext() at System.Linq.Enumerable.TryGetFirst[TSource](IEnumerable1 source, Boolean& found) at System.Linq.Enumerable.First[TSource](IEnumerable1 source) at Microsoft.EntityFrameworkCore.Query.Internal.QueryCompiler.<>c__DisplayClass15_11.b__0(QueryContext qc) ClientConnectionId:7c19efa6-d951-4139-8135-8dbcd5050c20 Error Number:208,State:1,Class:16

ApplicationUsers is my IdentityUser and is located in ManagementStudio.Data.Models. DocumentStudio references it.

public class ApplicationUsers : IdentityUser
{
    public string FirstName { get; set; }
    public string LastName { get; set; }
    [DataType(DataType.Date)]
    [DisplayFormat(DataFormatString = "{0:yyyy-MM-dd}", ApplyFormatInEditMode = true)]
    public DateTime? DateOfBirth { get; set; }
    private DateTime createdOn = DateTime.Now;
    public DateTime CreatedOn
    {
        get
        {
            return (createdOn == DateTime.MinValue) ? DateTime.Now : createdOn;
        }
        set
        {
            createdOn = value;
        }
    }
    private DateTime updatedOn = DateTime.Now;
    public DateTime UpdatedOn
    {
        get
        {
            return (updatedOn == DateTime.MinValue) ? DateTime.Now : updatedOn;
        }
        set
        {
            updatedOn = value;
        }
    }
}

How can I solve this issue?

EDIT:

My full DBSet

public DbSet<ApplicationUsers> ApplicationUsers { get; set; }
public DbSet<UserRoles> UserRoles { get; set; }
public DbSet<IdentityUserRole<string>> IdentityUserRole { get; set; }
public DbSet<IdentityUserClaim<string>> IdentityUserClaim { get; set; }
public DbSet<Applications> Applications { get; set; }
public DbSet<Roles> Roles { get; set; }
public DbSet<ApiAccess> ApiAccess { get; set; }
public DbSet<EventLogs> EventLogs { get; set; }
public DbSet<ActivityLogs> ActivityLogs { get; set; }
public DbSet<CommunicationLogs> CommunicationLogs { get; set; }
public DbSet<UploadLogs> UploadLogs { get; set; }
public DbSet<Repositories> Repositories { get; set; }
public DbSet<Emails> Emails { get; set; }
public DbSet<Assets> Assets { get; set; }
public DbSet<Announcements> Announcements { get; set; }
public DbSet<AnnouncementAttachments> AnnouncementAttachments { get; set; }

List of Models: enter image description here

c#
asp.net
.net
asp.net-mvc
asp.net-core
asked on Stack Overflow Jun 26, 2019 by JianYA • edited Jun 26, 2019 by JianYA

1 Answer

0

As you said in comments your table name for ApplicationUsers class is ManagementStudio.ApplicationUsers. You need to tell EF your schema name, because it use dbo by default. There is a lot of ways to do this:

Use TableAttribute:

[Table("ApplicationUsers", Schema = "ManagementStudio")]
public class ApplicationUsers : IdentityUser
{

}

Use fluent API:

public class ManagementStudioDbContext: IdentityDbContext
{
    public DbSet<ApplicationUsers> ApplicationUsers { get; set; }

    protected override void OnModelCreating(ModelBuilder modelBuilder)
    {
        modelBuilder.Entity<Blog>()
            .ToTable("ApplicationUsers", schema: "ManagementStudio");
    }
}

Set default schema name with fluent API:

public class ManagementStudioDbContext: IdentityDbContext
{
    protected override void OnModelCreating(ModelBuilder modelBuilder)
    {
        modelBuilder.HasDefaultSchema("MyCustomSchema");
    }
}
answered on Stack Overflow Jun 26, 2019 by vasily.sib

User contributions licensed under CC BY-SA 3.0