Azureアプリサービス(モバイル)のデータベースコンテキストが失敗する

JTIM

Azure AppService-モバイルでコントローラーを実行しています。トレースは、db.SaveChanges()これが失敗するまで、以下のコードが正常に実行されることを示しています。

var telemetry = new Microsoft.ApplicationInsights.TelemetryClient();
telemetry.TrackTrace("Create User");
using (BCMobileAppContext db = new BCMobileAppContext())
{
     string Username_NoSpaces = username.Username.Replace(" ", "");
     var user = db.Users.FirstOrDefault(u => u.Username_NoSpaces == Username_NoSpaces || u.MicrosoftToken == this.User.Identity.Name);
     telemetry.TrackTrace("1");
     if (user == null && !Username_NoSpaces.Contains(","))
     {
          telemetry.TrackTrace("2");
           DateTime now = DateTime.UtcNow;
           telemetry.TrackTrace("3");
           string username_noSpaces = username.Username.Replace(" ", "");
           DataObjects.User userItem = new DataObjects.User() { Created = now, UserId = this.User.Identity.Name, MicrosoftToken = this.User.Identity.Name, Username_NoSpaces = username_noSpaces, Update = now, Username = username.Username, Gold = 1, Level = 1, Title = "Sir", InGameCrest = "", ReceiveNotifications = true };
           telemetry.TrackTrace("4");
           UserDTO returnObject1 = new UserDTO() { Created = userItem.Created, isCreated = true, MicrosoftId = userItem.MicrosoftToken, Username = userItem.Username };
            telemetry.TrackTrace("5");
            db.Users.Add(userItem);
            telemetry.TrackTrace("6");
            db.SaveChanges();         //Trace and code fails
            telemetry.TrackTrace("7");
            UserDTO returnObject = new UserDTO() { Created = userItem.Created, isCreated = true, MicrosoftId = userItem.MicrosoftToken, Username = userItem.Username };
            telemetry.TrackTrace("8");
            return Ok(returnObject);
       }
}

appserviceの診断からのスタックトレース(残念ながら私は理解していません)は次のようになります。

2016-04-07T17:29:19  PID[5008] Error       Operation=ReflectedHttpActionDescriptor.ExecuteAsync, Exception=System.Data.Entity.Validation.DbEntityValidationException: Validation failed for one or more entities. See 'EntityValidationErrors' property for more details.
   at System.Data.Entity.Internal.InternalContext.SaveChanges()
   at System.Data.Entity.Internal.LazyInternalContext.SaveChanges()
   at System.Data.Entity.DbContext.SaveChanges()
   at BCMobileAppService.Controllers.Test2Controller.Post(UserDTO username) in C:\Users\johann\Desktop\BCMobileApp_Runtime\BCMobileAppService\Controllers\TestController.cs:line 78
   at lambda_method(Closure , Object , Object[] )
   at System.Web.Http.Controllers.ReflectedHttpActionDescriptor.ActionExecutor.<>c__DisplayClass10.<GetExecutor>b__9(Object instance, Object[] methodParameters)
   at System.Web.Http.Controllers.ReflectedHttpActionDescriptor.ActionExecutor.Execute(Object instance, Object[] arguments)
   at System.Web.Http.Controllers.ReflectedHttpActionDescriptor.ExecuteAsync(HttpControllerContext controllerContext, IDictionary 2 arguments, CancellationToken cancellationToken)
--- End of stack trace from previous location where exception was thrown ---
   at System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(Task task)
   at System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task)
   at System.Web.Http.Tracing.ITraceWriterExtensions.<TraceBeginEndAsyncCore>d__18 1.MoveNext()
2016-04-07T17:29:19  PID[5008] Error       Operation=ApiControllerActionInvoker.InvokeActionAsync, Exception=System.Data.Entity.Validation.DbEntityValidationException: Validation failed for one or more entities. See 'EntityValidationErrors' property for more details.
   at System.Data.Entity.Internal.InternalContext.SaveChanges()
   at System.Data.Entity.Internal.LazyInternalContext.SaveChanges()
   at System.Data.Entity.DbContext.SaveChanges()
   at BCMobileAppService.Controllers.Test2Controller.Post(UserDTO username) in C:\Users\johann\Desktop\BCMobileApp_Runtime\BCMobileAppService\Controllers\TestController.cs:line 78
   at lambda_method(Closure , Object , Object[] )
   at System.Web.Http.Controllers.ReflectedHttpActionDescriptor.ActionExecutor.<>c__DisplayClass10.<GetExecutor>b__9(Object instance, Object[] methodParameters)
   at System.Web.Http.Controllers.ReflectedHttpActionDescriptor.ActionExecutor.Execute(Object instance, Object[] arguments)
   at System.Web.Http.Controllers.ReflectedHttpActionDescriptor.ExecuteAsync(HttpControllerContext controllerContext, IDictionary 2 arguments, CancellationToken cancellationToken)
--- End of stack trace from previous location where exception was thrown ---
   at System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(Task task)
   at System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task)
   at System.Web.Http.Tracing.ITraceWriterExtensions.<TraceBeginEndAsyncCore>d__18 1.MoveNext()
--- End of stack trace from previous location where exception was thrown ---
   at System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(Task task)
   at System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task)
   at System.Web.Http.Controllers.ApiControllerActionInvoker.<InvokeActionAsyncCore>d__0.MoveNext()
--- End of stack trace from previous location where exception was thrown ---
   at System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(Task task)
   at System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task)
   at System.Web.Http.Tracing.ITraceWriterExtensions.<TraceBeginEndAsyncCore>d__18 1.MoveNext()
2016-04-07T17:29:19  PID[5008] Error       Operation=Test2Controller.ExecuteAsync, Exception=System.Data.Entity.Validation.DbEntityValidationException: Validation failed for one or more entities. See 'EntityValidationErrors' property for more details.
   at System.Data.Entity.Internal.InternalContext.SaveChanges()
   at System.Data.Entity.Internal.LazyInternalContext.SaveChanges()
   at System.Data.Entity.DbContext.SaveChanges()
   at BCMobileAppService.Controllers.Test2Controller.Post(UserDTO username) in C:\Users\johann\Desktop\BCMobileApp_Runtime\BCMobileAppService\Controllers\TestController.cs:line 78
   at lambda_method(Closure , Object , Object[] )
   at System.Web.Http.Controllers.ReflectedHttpActionDescriptor.ActionExecutor.< >c__DisplayClass10.<GetExecutor>b__9(Object instance, Object[] methodParameters)
   at System.Web.Http.Controllers.ReflectedHttpActionDescriptor.ActionExecutor.Execute(Object instance, Object[] arguments)
   at System.Web.Http.Controllers.ReflectedHttpActionDescriptor.ExecuteAsync(HttpControllerContext controllerContext, IDictionary 2 arguments, CancellationToken cancellationToken)
--- End of stack trace from previous location where exception was thrown ---
   at System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(Task task)
   at System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task)
   at System.Web.Http.Tracing.ITraceWriterExtensions.<TraceBeginEndAsyncCore>d__18 1.MoveNext()
--- End of stack trace from previous location where exception was thrown ---
   at System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(Task task)
   at System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task)
   at System.Web.Http.Controllers.ApiControllerActionInvoker.<InvokeActionAsyncCore>d__0.MoveNext()
--- End of stack trace from previous location where exception was thrown ---
   at System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(Task task)
   at System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task)
   at System.Web.Http.Tracing.ITraceWriterExtensions.<TraceBeginEndAsyncCore>d__18 1.MoveNext()
--- End of stack trace from previous location where exception was thrown ---
   at System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(Task task)
   at System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task)
   at System.Web.Http.Filters.ActionFilterAttribute.<CallOnActionExecutedAsync>d__5.MoveNext()
--- End of stack trace from previous location where exception was thrown ---
   at System.Web.Http.Filters.ActionFilterAttribute.<CallOnActionExecutedAsync>d__5.MoveNext()
--- End of stack trace from previous location where exception was thrown ---
   at System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(Task task)
   at System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task)
   at System.Web.Http.Filters.ActionFilterAttribute.<ExecuteActionFilterAsyncCore>d__0.MoveNext()
--- End of stack trace from previous location where exception was thrown ---
   at System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(Task task)
   at System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task)
   at System.Web.Http.Controllers.ActionFilterResult.<ExecuteAsync>d__2.MoveNext()
--- End of stack trace from previous location where exception was thrown ---
   at System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(Task task)
   at System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task)
   at System.Web.Http.Tracing.Tracers.HttpControllerTracer.<ExecuteAsyncCore>d__5.MoveNext()
--- End of stack trace from previous location where exception was thrown ---
   at System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(Task task)
   at System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task)
   at System.Web.Http.Tracing.ITraceWriterExtensions.<TraceBeginEndAsyncCore>d__18 1.MoveNext()

更新

だから私はこれを試してみます、それはより詳細なエラーメッセージを与えるでしょう:

catch (DbEntityValidationException dbEx)
{
foreach (var validationErrors in dbEx.EntityValidationErrors)
{
    foreach (var validationError in validationErrors.ValidationErrors)
    {
        Trace.TraceInformation("Property: {0} Error: {1}", 
                                validationError.PropertyName, 
                                validationError.ErrorMessage);
    }
}
}

また

私はあってはならない分野があることを確認するためにすべての設定を通過しますnullですnullに従ってとしてのstackoverflow上でこの答え

上記のテスト

例外は、Idフィールドが必須であることを隠します。これは例外です。

私が使用しているデータベースEntityDataここではmsdnで説明されています)の出所IdMobileServiceでの私の使用はId、行を実行したときに作成されたものでしたが、失敗しましたdb.SaveChanges()誰かがこれを明確にすることができますか?クラスは次のようになります。

 public abstract class EntityData : ITableData
{
    protected EntityData();

    [Index(IsClustered = true)]
    [TableColumn(TableColumnType.CreatedAt)]
    public DateTimeOffset? CreatedAt { get; set; }
    [TableColumn(TableColumnType.Deleted)]
    public bool Deleted { get; set; }
    [TableColumn(TableColumnType.Id)]
    public string Id { get; set; }
    [TableColumn(TableColumnType.UpdatedAt)]
    public DateTimeOffset? UpdatedAt { get; set; }
    [TableColumn(TableColumnType.Version)]
    public byte[] Version { get; set; }
}
エルカン・デミレル

EFでは文字列主キーの自動生成サポートはありません。そのため、手動で主キーを割り当てる必要があります。

コンストラクターを使用してIdCreatedDate初期化できUpdatedDateます。

    public abstract class EntityData : ITableData
    {
     //Change the constructor to initilaize required filled with meaningful data.
        protected EntityData()
        {
          Id=Guid.NewGuid().ToString();
          CreatedDate=DateTime.UtcNow;
          UpdatedDate=DateTime.UtcNow;
        }

        [Index(IsClustered = true)]
        [TableColumn(TableColumnType.CreatedAt)]
        public DateTimeOffset? CreatedAt { get; set; }
        [TableColumn(TableColumnType.Deleted)]
        public bool Deleted { get; set; }
        [TableColumn(TableColumnType.Id)]
        public string Id { get; set; }
        [TableColumn(TableColumnType.UpdatedAt)]
        public DateTimeOffset? UpdatedAt { get; set; }
        [TableColumn(TableColumnType.Version)]
        public byte[] Version { get; set; }
    }

コンテキストでsavechangesメソッドをオーバーライドできます。エンティティを変更すると、このメソッドはupdateddateを自動的に変更します。

 public override int SaveChanges()
    {
        //Get Modified Entities
        var modifiedEntries = ChangeTracker.Entries()
             .Where(x => x.Entity is ITableData
                 && (x.State == EntityState.EntityState.Modified));
        foreach (var entry in modifiedEntries)
         {
           var entity = entry.Entity as ITableData;
           //Modify updateddate
           if (entity != null)
            {
              entity.UpdatedDate = DateTime.UtcNow;
            }
         }
        return base.SaveChanges();
    }

編集:最初の解決策は、どのライブラリでも実現されていない一般的な解決策でした。

serilazationに必要なEntityDataモバイルクライアントとバックエンドサーバーが相互に通信しようとする場合、このクラスが役立ちます。たとえば、モバイルクライアントはナビゲーションプロパティをサポートしていませんが、バックエンドサーバーはサポートしています。entitydataをセリライジングすると、これらのプロパティが非表示になります。

このアプリ用にデータベースを設計する場合。このドキュメントに従ってください

まずEntityData、ライブラリ内にあるクラスを使用する必要があります。モデルは、EntityDataクラスではなく、モデルから継承する必要があります

2番目:オーバーライドモデルの作成時に、コンテキストにこのコードが含まれている必要があります。作成/更新されたatとIdの自動更新にこれが必要です(これがあなたの質問に対する答えです)。

   protected override void OnModelCreating(DbModelBuilder modelBuilder)
        {
            string schema = ServiceSettingsDictionary.GetSchemaName();
            if (!string.IsNullOrEmpty(schema))
            {
                modelBuilder.HasDefaultSchema(schema);
            }

            modelBuilder.Conventions.Add(
                new AttributeToColumnAnnotationConvention<TableColumnAttribute, string>(
                    "ServiceTableColumn", (property, attributes) => attributes.Single().ColumnType.ToString()));
        }

すでに存在するデータベースを使用する場合は、このドキュメントに従ってください

この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。

侵害の場合は、連絡してください[email protected]

編集
0

コメントを追加

0

関連記事

分類Dev

VS 2017 が Azure モバイル アプリ スキャフォールディング テーブル コントローラーの作成に失敗する

分類Dev

マルチテナントのAzureモバイルアプリサービスの呼び出しが401.71で失敗する

分類Dev

データが削除されると、Azure AppServiceモバイルアプリデータベースの同期が失敗する

分類Dev

Azureモバイルサービスデータベースの既存のアイテムを更新する

分類Dev

AzureモバイルサービスFacebook認証Androidクライアントが失敗する

分類Dev

C#Windowsユニバーサルリストビューのアイコンへのバインドボタンが失敗する

分類Dev

コードコントラクト-VisualStudio TeamServiceスクリプトビルドサーバーの単体テストが失敗する

分類Dev

Azure-アプリサービス-モバイルアプリクイックスタート-データベースの接続

分類Dev

Azure SQLServerのデータベースコピースクリプトが失敗する

分類Dev

IBMモバイルアプリビルダーがCloudantデータベースのドキュメントを表示しないのはなぜですか?

分類Dev

Jasmineを使用したAngularサービスのテスト:モジュールアプリのインスタンス化に失敗しました

分類Dev

HPプリンター/スキャナードライバーのインストールに失敗する

分類Dev

大量のデータでWebサービスasmxサイレントのデバッグが失敗する

分類Dev

Azureモバイルアプリサービスのセキュリティ

分類Dev

Azureモバイルサービスアプリケーションのアーキテクチャ

分類Dev

インターフェイスのコレクションを逆シリアル化すると、カスタムコンバーターを使用した以前のデータモデルからのJSONの逆シリアル化が失敗します

分類Dev

クエリ結果の行数をアサートするpytestテストが失敗すると、データベース操作がハングする

分類Dev

データベース接続を使用してコードをAzureWebにデプロイすると、Flaskアプリはレンダリングに失敗しますが、ローカルサーバーからは正常に機能します

分類Dev

アプリをアンインストールすると、Googleゲームサービスのデータが失われます

分類Dev

「ベースシステムのインストール」のデブートストラップエラー「リリースのコードネームの特定に失敗しました」が原因で、Debianラップトップのインストールが失敗する

分類Dev

vue.jsブートストラップモーダルデータバインドが失敗する

分類Dev

一部のコンテキストで、イベントリスナーがアタッチまたは削除に失敗する

分類Dev

自動ビューバインディングを使用するレイアウトにカスタムビューを含めましたが、アプリのコンパイルに失敗します

分類Dev

新しいAzureリソースグループとWebサイトへのデプロイが失敗する

分類Dev

Firebase-adminがnodejsからリアルタイムデータベースへの書き込みにサイレントに失敗する

分類Dev

タスクバー>ファイルエクスプローラー>コンテキストメニューが失敗する

分類Dev

「アプリケーションコンテキストのロードに失敗しました。少なくとも1つのJPAメタモデルが存在する必要があります」を修正する方法

分類Dev

アプリのサービスが認証を使用する場合のAzure通知ハブデバイスの登録に失敗します

分類Dev

既存のAzureモバイルアプリにWebサイトを追加する(アプリサービス)

Related 関連記事

  1. 1

    VS 2017 が Azure モバイル アプリ スキャフォールディング テーブル コントローラーの作成に失敗する

  2. 2

    マルチテナントのAzureモバイルアプリサービスの呼び出しが401.71で失敗する

  3. 3

    データが削除されると、Azure AppServiceモバイルアプリデータベースの同期が失敗する

  4. 4

    Azureモバイルサービスデータベースの既存のアイテムを更新する

  5. 5

    AzureモバイルサービスFacebook認証Androidクライアントが失敗する

  6. 6

    C#Windowsユニバーサルリストビューのアイコンへのバインドボタンが失敗する

  7. 7

    コードコントラクト-VisualStudio TeamServiceスクリプトビルドサーバーの単体テストが失敗する

  8. 8

    Azure-アプリサービス-モバイルアプリクイックスタート-データベースの接続

  9. 9

    Azure SQLServerのデータベースコピースクリプトが失敗する

  10. 10

    IBMモバイルアプリビルダーがCloudantデータベースのドキュメントを表示しないのはなぜですか?

  11. 11

    Jasmineを使用したAngularサービスのテスト:モジュールアプリのインスタンス化に失敗しました

  12. 12

    HPプリンター/スキャナードライバーのインストールに失敗する

  13. 13

    大量のデータでWebサービスasmxサイレントのデバッグが失敗する

  14. 14

    Azureモバイルアプリサービスのセキュリティ

  15. 15

    Azureモバイルサービスアプリケーションのアーキテクチャ

  16. 16

    インターフェイスのコレクションを逆シリアル化すると、カスタムコンバーターを使用した以前のデータモデルからのJSONの逆シリアル化が失敗します

  17. 17

    クエリ結果の行数をアサートするpytestテストが失敗すると、データベース操作がハングする

  18. 18

    データベース接続を使用してコードをAzureWebにデプロイすると、Flaskアプリはレンダリングに失敗しますが、ローカルサーバーからは正常に機能します

  19. 19

    アプリをアンインストールすると、Googleゲームサービスのデータが失われます

  20. 20

    「ベースシステムのインストール」のデブートストラップエラー「リリースのコードネームの特定に失敗しました」が原因で、Debianラップトップのインストールが失敗する

  21. 21

    vue.jsブートストラップモーダルデータバインドが失敗する

  22. 22

    一部のコンテキストで、イベントリスナーがアタッチまたは削除に失敗する

  23. 23

    自動ビューバインディングを使用するレイアウトにカスタムビューを含めましたが、アプリのコンパイルに失敗します

  24. 24

    新しいAzureリソースグループとWebサイトへのデプロイが失敗する

  25. 25

    Firebase-adminがnodejsからリアルタイムデータベースへの書き込みにサイレントに失敗する

  26. 26

    タスクバー>ファイルエクスプローラー>コンテキストメニューが失敗する

  27. 27

    「アプリケーションコンテキストのロードに失敗しました。少なくとも1つのJPAメタモデルが存在する必要があります」を修正する方法

  28. 28

    アプリのサービスが認証を使用する場合のAzure通知ハブデバイスの登録に失敗します

  29. 29

    既存のAzureモバイルアプリにWebサイトを追加する(アプリサービス)

ホットタグ

アーカイブ