2013-11-15 2 views
1

새로운 .NET 웹 응용 프로그램 프로젝트를 만들고 선택한 템플릿에 대한 개별 사용자 계정 인증을 선택했습니다. 기본적으로 App_Data 디렉토리에 로컬 데이터베이스로 Identity 데이터베이스를 설정합니다. 이것은 잘 동작했다. 그렇지만 내 응용 프로그램의 나머지 부분을 보유하고있는 실제 SQL Server 데이터베이스에 멤버쉽을위한 AspNet 테이블이 필요했습니다. 그래서 로컬 SQL Server 데이터베이스를 가리 키도록 DefaultConnection 문자열을 변경했습니다. 응용 프로그램을 다시 배포하면 EF가 실제 데이터베이스에서 해당 테이블을 자동으로 작성했습니다. 그래서 모든 것이 좋게 보였다..NET ID UserManager.FindAsyc throwing " 'Discriminator'열 이름이 잘못되었습니다."

로그인하려고 할 때 UserManager.FindAsync를 호출하면 다음과 같은 SqlException이 발생합니다. "잘못된 식별자 ''.". " 전체 StackTrace는 아래를 참조하십시오.

기본 웹 응용 프로그램 템플릿과 함께 제공되는 동일한 ApplicationDbContext 및 ApplicationUser를 사용하고 있습니다.

내가 뭘 잘못하고 있는지에 대한 아이디어가 있습니까? 이것은 .NET Identity로 작업 한 첫 번째 시간입니다. 연결 문자열을 변경하는 것 외에도 기존 SQL Server 데이터베이스와 작동하도록하는 다른 방법이 있습니까?

감사합니다.

전체 스택 추적 :

at System.Data.SqlClient.SqlConnection.OnError(SqlException exception, Boolean breakConnection, Action`1 wrapCloseInAction)\r\n at System.Data.SqlClient.SqlInternalConnection.OnError(SqlException exception, Boolean breakConnection, Action`1 wrapCloseInAction)\r\n at System.Data.SqlClient.TdsParser.ThrowExceptionAndWarning(TdsParserStateObject stateObj, Boolean callerHasConnectionLock, Boolean asyncClose)\r\n at System.Data.SqlClient.TdsParser.TryRun(RunBehavior runBehavior, SqlCommand cmdHandler, SqlDataReader dataStream, BulkCopySimpleResultSet bulkCopyHandler, TdsParserStateObject stateObj, Boolean& dataReady)\r\n at System.Data.SqlClient.SqlDataReader.TryConsumeMetaData()\r\n at System.Data.SqlClient.SqlDataReader.get_MetaData()\r\n at System.Data.SqlClient.SqlCommand.FinishExecuteReader(SqlDataReader ds, RunBehavior runBehavior, String resetOptionsString)\r\n at System.Data.SqlClient.SqlCommand.RunExecuteReaderTds(CommandBehavior cmdBehavior, RunBehavior runBehavior, Boolean returnStream, Boolean async, Int32 timeout, Task& task, Boolean asyncWrite, SqlDataReader ds)\r\n at System.Data.SqlClient.SqlCommand.RunExecuteReader(CommandBehavior cmdBehavior, RunBehavior runBehavior, Boolean returnStream, String method, TaskCompletionSource`1 completion, Int32 timeout, Task& task, Boolean asyncWrite)\r\n at System.Data.SqlClient.SqlCommand.RunExecuteReader(CommandBehavior cmdBehavior, RunBehavior runBehavior, Boolean returnStream, String method)\r\n at System.Data.SqlClient.SqlCommand.ExecuteReader(CommandBehavior behavior, String method)\r\n at System.Data.SqlClient.SqlCommand.ExecuteDbDataReader(CommandBehavior behavior)\r\n at System.Data.Common.DbCommand.ExecuteReader(CommandBehavior behavior)\r\n at System.Data.Entity.Infrastructure.Interception.DbCommandDispatcher.<>c__DisplayClassb.<Reader>b__8()\r\n at System.Data.Entity.Infrastructure.Interception.InternalDispatcher`1.Dispatch[TInterceptionContext,TResult](Func`1 operation, TInterceptionContext interceptionContext, Action`1 executing, Action`1 executed)\r\n at System.Data.Entity.Infrastructure.Interception.DbCommandDispatcher.Reader(DbCommand command, DbCommandInterceptionContext interceptionContext)\r\n at System.Data.Entity.Internal.InterceptableDbCommand.ExecuteDbDataReader(CommandBehavior behavior)\r\n at System.Data.Common.DbCommand.ExecuteReader(CommandBehavior behavior)\r\n at System.Data.Entity.Core.EntityClient.Internal.EntityCommandDefinition.ExecuteStoreCommands(EntityCommand entityCommand, CommandBehavior behavior) 

답변

2

두 개의 서로 다른 DbContexts? DbContext가 IdentityUser 유형의 DbContext로 작성한 데이터베이스 또는 어떤 방식 으로든 IdentityUser와 관련된 일부 엔티티에 의해 생성 된 데이터베이스 때문에 오류 메시지가 발생할 수 있습니다. UserManager는 IdentityUser에서 상속하는 유형의 DbSet을 포함하는 다른 Context (ApplicationDbContext?)를 사용하는 것 같습니다. 모델 엔티티 프레임 워크의 다른 유형을 상속하는 유형을 사용하는 경우 특정 행에 저장된 엔티티의 유형 이름을 포함 할 discriminator라는 열을 사용/예상합니다.

+2

일단 내가 AspNet ... 테이블을 삭제하고 다시 응용 프로그램을 실행하면 테이블이 다시 재생되어 정상적으로 작동합니다. 다시 생각해 보면, 내가 처음 실행 한 데이터베이스 테이블을 만든 동일한 솔루션 내에서 별도의 웹 프로젝트를 만든 다음 다른 웹 프로젝트에서 동일한 테이블과 연결 문자열을 사용해 보았을 가능성이 있습니다. 그것이 왜 문제를 일으켰을 지 확신 할 수 없지만, 그것을 지우고 다시 시작하는 것은 효과가있는 것으로 보입니다. 당신의 도움을 주셔서 감사합니다. –

1

이 오류는 자체 호스팅 웹 API에서 데이터베이스를 만든 다음 ASP.NET MVC 사이트에서 액세스하려고 시도한 경우에도 발생합니다. 두 프로젝트는 VS 2013에서 기본으로 제공됩니다.

Olav Nybo가 말했듯이 이것은 ASP.NET MVC가 IdentityUser에서 상속하는 ApplicationUser로 로그인하려고 시도하는 것과 관련이 있습니다. 저를위한 빠른 해결책은 ASP.NET MVC 웹 사이트에서 데이터베이스를 생성하는 것이 었습니다.

1

다소 늦었지만 IdentityUser를 확장하면 AspNetUsers 테이블에 사용중인 특성에 대한 새 사용자 지정 열과 IdentityUser 유형에 대한 열이 필요합니다.

예를 들어 새 ApplicationUser : IdentityUser를 만드는 경우 Discriminator라는 테이블에 새 열이 생겨 ApplicationUser 값을 갖게됩니다. Code First를 사용하지 않고 데이터베이스 변경 사항을 수동으로 적용해야하는 경우입니다.