【问题标题】:ArangoDb.Net upsert always insertArangoDb.Net upsert 总是插入
【发布时间】:2016-09-17 13:30:11
【问题描述】:

我正在使用 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();
        }

第一次运行时,[insert] 对象被添加到数据库中。 因此,我现在的数据库是:

但是在第二次运行代码时,它会抛出一个错误:

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

问题是:我的问题是什么以及如何解决?

谢谢,

【问题讨论】:

    标签: arangodb


    【解决方案1】:

    问题可能是 upsert 搜索表达式序列化:

    假设Account 类定义为:

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

    upsert 搜索表达式: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 }

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2013-02-23
      • 2014-12-29
      • 2021-06-02
      • 2011-02-12
      • 2017-01-16
      • 2012-01-25
      • 1970-01-01
      相关资源
      最近更新 更多