2016-09-15 4 views
1

を挿入します。ここではArangoDb.Netアップサートいつも私がArangoDatabaseとそのドライバを使用するCRUD機能を持つ小さなアプリケーションを作ってるんだ

http://www.arangoclient.net/

は私のコードです:

 var insert = new Account 
     { 
      Email = "[email protected]", 
      FirstName = "Adam", 
      LastName = "Smith" 
     }; 

     var update = new Account 
     { 
      Email = "[email protected]", 
      FirstName = "John", 
      LastName = "Peterson" 
     }; 

     using (var arangoDatabase = new ArangoDatabase(new DatabaseSharedSetting() 
     { 
      Url = "http://127.0.0.1:8529/", 
      Database = "_system", 
      Credential = new NetworkCredential() 
      { 
       UserName = "root", 
       Password = "xvxvc" 
      } 
     })) 
     { 
      arangoDatabase.Query() 
       .Upsert(_ => new Account() {Email = insert.Email}, 
        _ => insert, ((aql, x) => update)) 
        .In<Account>() 
        .Execute(); 
     } 

初めて実行中の[挿入]オブジェクトがデータベースに追加されます。 したがって、私のデータベースは次のとおりです。

Data has been imported successfully

しかし、コードを実行する2回目、それは私にエラーがスローされます。

unique constraint violated (while executing). ErrorNumber: 1210 HttpStatusCode: 409 

の質問は:どのように私の問題とは何かをそれを解決する?

public class Account 
{ 
    public string Email { get; set; } 
    public string FirstName { get; set; } 
    public string LastName { get; set; } 
} 

アップサート検索式:new Account() {Email = insert.Email}がにシリアライズします:

Accountクラス定義があると仮定します

問題は検索式のシリアル化をアップサートすることができ、

enter image description here

答えて

2

をありがとう

{ Email: "[email protected]", FirstName: null, LastName: null }

が、何が期待されることは次のとおりです。

{ Email: "[email protected]" }

検索式が文書を発見したことはありませんので、その後、挿入が発生すると、あなたがunique constraint violatedを取得します。

FirstNameLastNameメンバーをシリアル化を避けるには、2つのソリューションがあります。

一つは、私たちがシリアライズにヌルを無視するJson.net JsonProperty属性を使用することができます:

public class Account 
{ 
    public string Email { get; set; } 
    [Newtonsoft.Json.JsonProperty(NullValueHandling = NullValueHandling.Ignore)] 
    public string FirstName { get; set; } 
    [Newtonsoft.Json.JsonProperty(NullValueHandling = NullValueHandling.Ignore)] 
    public string LastName { get; set; } 
} 

そして、他の方法が使用することです検索式の匿名オブジェクト:

arangoDatabase.Query() 
       .Upsert(_ => new Account() {Email = insert.Email} 

// should be 

arangoDatabase.Query() 
       .Upsert(_ => new {Email = insert.Email} 

匿名オブジェクトの使用に関するワンノートあなたは、あなたが匿名オブジェクトで_keyを使用する必要があり、キー識別子としてEmailを指定した場合

public class Account 
{ 
    [DocumentProperty(Identifier = IdentifierType.Key)] 
    public string Email { get; set; } 
    public string FirstName { get; set; } 
    public string LastName { get; set; } 
} 

:CTはEmailメンバーは、あなたが、たとえば、その命名規則に指定したものに他の何かベースに解決できることである

arangoDatabase.Query() .Upsert(_ => new { _key = insert.Email }

関連する問題