簡體   English   中英

ArangoDb.Net upsert總是插入

[英]ArangoDb.Net upsert always insert

我正在使用ArangoDatabase及其驅動程序制作帶有CRUD功能的小型應用程序:

http://www.arangoclient.net/

這是我的代碼:

        var insert = new Account
        {
            Email = "email01@gmail.com",
            FirstName = "Adam",
            LastName = "Smith"
        };

        var update = new Account
        {
            Email = "email01@gmail.com",
            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();
        }

首次運行時,[插入]對象被添加到數據庫中。 因此,我的數據庫現在是:

數據已成功導入

但是在第二次運行代碼時,它引發了一個錯誤:

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

問題是:我的問題是什么以及如何解決?

謝謝,

在此處輸入圖片說明

問題可能是向上搜索表達式序列化:

假設Account類定義為:

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

更新搜索表達式: new Account() {Email = insert.Email}將序列化為:

{ Email: "email01@gmail.com", FirstName: null, LastName: null }

但預期的是:

{ Email: "email01@gmail.com" }

由於搜索表達式將永遠找不到文檔,因此將發生插入操作,並且unique constraint violated

有兩種解決方案可以避免序列化FirstNameLastName成員:

一種是我們可以使用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}

關於使用匿名對象的一個​​注意事項是, Email成員可以根據您為其命名約定指定的內容來解析其他內容,例如:

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

如果將Email指定為密鑰標識符, _key在匿名對象中使用_key

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM