3

SimpleMembership を使用して SQL が動作する MVC4 サイトを取得しようとしていますが、ユーザー レコードを作成するたびにエラーが発生します。

[SqlException (0x80131904): Cannot insert the value NULL into column 'Id', table 'NFBC.dbo.User'; column does not allow nulls. INSERT fails.
The statement has been terminated.]
   System.Data.SqlClient.SqlConnection.OnError(SqlException exception, Boolean breakConnection, Action`1 wrapCloseInAction) +1753346
   System.Data.SqlClient.SqlInternalConnection.OnError(SqlException exception, Boolean breakConnection, Action`1 wrapCloseInAction) +5295154
   System.Data.SqlClient.TdsParser.ThrowExceptionAndWarning(TdsParserStateObject stateObj, Boolean callerHasConnectionLock, Boolean asyncClose) +242
   System.Data.SqlClient.TdsParser.TryRun(RunBehavior runBehavior, SqlCommand cmdHandler, SqlDataReader dataStream, BulkCopySimpleResultSet bulkCopyHandler, TdsParserStateObject stateObj, Boolean& dataReady) +1682
   System.Data.SqlClient.SqlCommand.FinishExecuteReader(SqlDataReader ds, RunBehavior runBehavior, String resetOptionsString) +269
   System.Data.SqlClient.SqlCommand.RunExecuteReaderTds(CommandBehavior cmdBehavior, RunBehavior runBehavior, Boolean returnStream, Boolean async, Int32 timeout, Task& task, Boolean asyncWrite) +1325
   System.Data.SqlClient.SqlCommand.RunExecuteReader(CommandBehavior cmdBehavior, RunBehavior runBehavior, Boolean returnStream, String method, TaskCompletionSource`1 completion, Int32 timeout, Task& task, Boolean asyncWrite) +175
   System.Data.SqlClient.SqlCommand.InternalExecuteNonQuery(TaskCompletionSource`1 completion, String methodName, Boolean sendToPipe, Int32 timeout, Boolean asyncWrite) +205
   System.Data.SqlClient.SqlCommand.ExecuteNonQuery() +160
   WebMatrix.Data.Database.Execute(String commandText, Object[] args) +116
   WebMatrix.WebData.DatabaseWrapper.Execute(String commandText, Object[] parameters) +55
   WebMatrix.WebData.SimpleMembershipProvider.CreateUserRow(IDatabase db, String userName, IDictionary`2 values) +1074
   WebMatrix.WebData.SimpleMembershipProvider.CreateUserAndAccount(String userName, String password, Boolean requireConfirmation, IDictionary`2 values) +102
   WebMatrix.WebData.WebSecurity.CreateUserAndAccount(String userName, String password, Object propertyValues, Boolean requireConfirmationToken) +127
   NFBC.Controllers.AccountController.Register(RegisterModel model) in e:\PROJECTS\DEVELOPMENT\00-Current\NFBC\NFBC\Controllers\AccountController.cs:74

したがって、これは、ユーザーテーブルに行を挿入しようとしているが、テーブルの主キーである「Id」プロパティを設定していないことを示しています。この ID は、プロバイダーが要求する int 列です。コードの実行方法は次のとおりです。

            WebSecurity.InitializeDatabaseConnection("NFBCEntitiesRaw", "User", "Id", "Email1", autoCreateTables: true);
            WebSecurity.CreateUserAndAccount(model.UserName, model.Password);

Id は int 主キー列、Email1 はユーザー名列、nvarchar(255) です。

データベースへの接続文字列:

<add name="NFBCEntitiesRaw" connectionString="data source=localhost;initial catalog=NFBC;integrated security=True;multipleactiveresultsets=True;application name=EntityFramework" providerName="System.Data.SqlClient" />

WebSecurity.CreateUserAndAccount、SimpleMembershipProvider.CreateUserAndAccount、および SimpleMembershipProvider.CreateUserRow のソース コードを調べましたが、これらのメソッドのいずれにおいても、ソース コードが User レコードに ID を割り当てていません。これにより、例外が発生している理由が確認できます。投げた。しかし、このメソッドでは ID を指定できません。このサンプルを SQLExpress に対して実行すると、ID が適切に割り当てられたように見えました。

ありがとう!

4

1 に答える 1

5

本格的な MS SQL データベース (SQL Server 2008 など) に接続していると仮定すると、自動インクリメントが必要な場合は、主キー フィールドをIDフィールドとしてマークする必要があります。テーブルをデザイン モードで開く必要があります ( Server Management StudioまたはVisual Studioを使用している場合は、テーブルを右クリックして [デザイン] をクリックします)。列を選択し、プロパティが表示されるまでペインIDをスクロールします。に変更して保存すれば完了です。次のようになります。Column PropertiesIdentity SpecificationIsIdentitytrue

ここに画像の説明を入力

HTH。

于 2012-11-22T03:23:51.003 に答える