.NET Core Недопустимое имя объекта «ApplicationUsers» при входе в систему - PullRequest
0 голосов
/ 26 июня 2019

Это моя функция входа в систему:

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 находится в ссылочной сборке dll под названием ManagementStudio.Data и выглядит следующим образом:

[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;
}

Когда я запускаюприложение и логин, я получаю эту ошибку:

Возникла исключительная ситуация при переборе результатов запроса для типа контекста 'ManagementStudio.Data.Models.ManagementStudioDbContext'.System.Data.SqlClient.SqlException (0x80131904): недопустимое имя объекта «ApplicationUsers».в System.Data.SqlClient.SqlConnection.OnError (исключение SqlException, логическое breakConnection, действие 1 wrapCloseInAction) at System.Data.SqlClient.SqlInternalConnection.OnError(SqlException exception, Boolean breakConnection, Action 1 wrapCloseInAction) в System.Data.SqlClient.TdsParser.ThrowExceptionAndWarning (TdsParserStateObject..TdsParser.TryRun (runBehavior runBehavior, SqlCommand cmdHandler, SqlDataReader DATASTREAM, BulkCopySimpleResultSet bulkCopyHandler, TdsParserStateObject stateObj, Boolean и dataReady) в System.Data.SqlClient.SqlDataReader.TryConsumeMetaData () в System.Data.SqlClient.SqlDataReader.get_MetaData () в системе.Data.SqlClient.SqlCommand.FinishExecuteReader (SqlDataReader DS, runBehavior runBehavior, String resetOptionsString) на System.Data.SqlClient.SqlCommand.RunExecuteReaderTds (CommandBehavior cmdBehavior, runBehavior runBehavior, булева returnStream, булева асинхронные, Int32 тайм-аут, задачи и задачи, булева asyncWrite, SqlDataReaderds) в System.Data.SqlClient.SqlCommand.RunExecuteReader (CommandBehavior cmdBehavior, RunBehavior runBehavior, логическое значение returnStream, TaskCompletionSource 1 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, IReadOnlyDictionary 2 parameterValues) в Microsoft.EntityFrameworkCore.Storage.Internal.RelationalCommand.ExecuteReader (соединение IRelationalConnection, IReadOnDefender_Exject_NeBell).EntityFrameworkCore.SqlServer..Internal.Linq.Enumerable.First [TSource] (IEnumerable 1 source) at Microsoft.EntityFrameworkCore.Query.Internal.QueryCompiler.<>c__DisplayClass15_1 1.b__0 (QueryContext qc) ClientConnectionId: 7c19efa6-d951-4139-8135-8dbcd5050c20 Номер ошибки: 208, состояние: 1, Class: 16

ApplicationUsers - это мой IdentityUser, который находится в ManagementStudio.Data.Models.DocumentStudio ссылается на него.

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;
        }
    }
}

Как решить эту проблему?

РЕДАКТИРОВАТЬ:

Мой полный 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; }

Список моделей:enter image description here

1 Ответ

0 голосов
/ 26 июня 2019

Как вы сказали в комментариях, ваше имя таблицы для ApplicationUsers класса ManagementStudio.ApplicationUsers.Вам нужно указать EF имя вашей схемы, потому что она использует dbo по умолчанию.Есть много способов сделать это:

Использовать TableAttribute :

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

}

Использовать свободный API:

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

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

Установить схему по умолчаниюимя с беглым API:

public class ManagementStudioDbContext: IdentityDbContext
{
    protected override void OnModelCreating(ModelBuilder modelBuilder)
    {
        modelBuilder.HasDefaultSchema("MyCustomSchema");
    }
}
...