2016-05-25 9 views
3

私はSQLiteのとオフライン同期機能を使用してアプリケーションを開発するためのAzureアプリケーション・サービス(モバイルアプリ)を使用しています。Azureのアプリケーション・サービス(モバイルアプリ)PRIMARY KEY制約の違反

public class Customer : EntityData 
{ 
    public string FirstName { get; set; } 
    public string LastName { get; set; } 
    //… 
    public DateTime DateCreated { get; set; } 
    public DateTime DateModified { get; set; } 
    public virtual IList<Card> Cards { get; set; } 
} 
public class Card : EntityData 
{ 
    public bool IsDisabled { get; set; } 
    public DateTime CreatedDate { get; set; } 
    public DateTime LastUsedDate { get; set; } 
} 

そして、私のコントローラのコードは次のとおりです: マイデータオブジェクトモデルがある

// GET tables/Customer 
    public IQueryable<Customer> GetAllCustomers() 
    { 
     return Query(); 
    } 

    // GET tables/Customer/48D68C86-6EA6-4C25-AA33-223FC9A27959 
    public SingleResult<Customer> GetCustomer(string id) 
    { 
     return Lookup(id); 
    } 

    // PATCH tables/Customers/48D68C86-6EA6-4C25-AA33-223FC9A27959 
    public Task<Customer> PatchCustomer(string id, Delta<Customer> patch) 
    { 
     return UpdateAsync(id, patch); 
    } 

    // POST tables/Customer 
    public async Task<IHttpActionResult> PostCustomer(Customer item) 
    { 
     Customer current = await InsertAsync(item); 
     return CreatedAtRoute("Tables", new { id = current.Id }, current); 
    } 

    // DELETE tables/Customer/48D68C86-6EA6-4C25-AA33-223FC9A27959 
    public Task DeleteCustomer(string id) 
    { 
     return DeleteAsync(id); 
    } 

私はこのシーンの後ろにマッピングされているか、非常にわかりませんが、私のクライアントから、私は呼び出しています:

await App.MobileService.SyncContext.PushAsync(); 
    await customerTable.PullAsync("customers", customerTable.CreateQuery()); 

顧客を挿入するためにデータの初期同期を実行するとすべて正常に動作しますが、いずれかを更新しようとするとエラーが発生します。「この操作は、 nflict: 'PRIMARY KEY制約' PK_dbo.Cards 'の違反です。オブジェクト 'dbo.Cards'に重複キーを挿入できません。重複キーの値は(000000003414)です。注:私はカードの詳細を変更していない、顧客のみ。 私はこの記事を見てきました:https://blogs.msdn.microsoft.com/azuremobile/2014/06/18/insertupdate-data-with-1n-relationship-using-net-backend-azure-mobile-services/ それが過度に複雑なようで、私はそれは私が後だものですかどうかわからないのですが...誰もが何が起こっているか知っていますか?

+0

Idは文字列であり、intではないため、Entity Frameworkの問題があると思われます。適切なCardIdをCustomerオブジェクトの文字列として設定し、ForeignKeyアノテーションを介してリンクしますか? –

+0

モバイルサービスでは、IDが文字列でなければならない理由がわかりません。コントローラの実装は、モバイルサービスのバックエンドをプロビジョニングするときに、サンプルソリューションで提供される関数の名前の変更です。 – Robin

+0

' PatchCustomer'?それとも、再びインサートを打っていますか? – SWilko

答えて

1

Azureのアプリケーション・サービス(モバイルアプリ)は、現時点では仲介者としてのSQLiteを使用する場合に外部キーを処理できないようです。そのようにするには、クライアント側で2つの別個のエンティティとしてテーブルを処理するしかありません(外部キーをサービス側に保持することができますが、外部キーを使用してデータを照会する際に問題が発生します) 。

2

は間違って行くことができ可能なものがたくさんあります。多分、あなたのクライアントは、実際には409競合の例外を取得したい理由です更新、のではなく、別のインサートを行っています。または、挿入が成功した可能性は低いですが、応答が失われたため、クライアントは挿入を再試行し、例外を取得します。

または、問題はテーブル間の関係である可能性があります。これをデバッグするには、まず、発信要求を記録して、何が起こっているかを確認する必要があります。クライアントがアップデートの代わりにインサートを送信している場合は、ログにその情報が表示されます。 Log outgoing requests in managed client (Xamarin, Windows)を参照してください。

次に、あなたのリモートサービスやEntity Frameworkの検証エラーが発生している理由を確認するためにローカルで実行中の1のいずれかにデバッガをアタッチすることができます。オフライン同期をやっている場合

ところで、あなたはまた、紛争処理のコードを追加する必要があります。ここでは、409を処理するサンプル(挿入が成功し、応答が失われた場合)と412の前提条件が失敗した場合(2人のクライアントが同じデータを更新しようとした場合):https://github.com/lindydonna/xamarin-forms-offline-sync/blob/master/XamarinFormsOffline/SyncHandler.cs#L23です。

+0

ありがとうございます、私はあなたのデバッグの提案を試み、必要に応じて元の質問に詳細を追加します。私は競合の処理を認識していますが、現時点では、この "競合"は、同期の対象を敗北させる新しいレコードが作成されている以外は何も停止します。 – Robin

+0

あなたの投稿は非常に役に立ちます!ありがとうございました! –

関連する問題