ArangoDb.Net upsert始终插入

ArangoDb.Net upsert始终插入,arangodb,Arangodb,我正在用ArangoDatabase及其驱动程序制作一个带有CRUD函数的小应用程序: 这是我的密码: var insert = new Account { Email = "email01@gmail.com", FirstName = "Adam", LastName = "Smith" }; var update = new Account

我正在用ArangoDatabase及其驱动程序制作一个带有CRUD函数的小应用程序:

这是我的密码:

        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();
        }
问题是:我的问题是什么?如何解决

谢谢,


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

假设
科目
类别定义为:

公共类帐户
{
公共字符串电子邮件{get;set;}
公共字符串名{get;set;}
公共字符串LastName{get;set;}
}
向上插入搜索表达式:
new Account(){Email=insert.Email}
将序列化为:

{电子邮件:email01@gmail.com,FirstName:null,LastName:null}

但人们期望的是:

{电子邮件:email01@gmail.com“}

由于搜索表达式将永远找不到文档,因此将发生insert,并且会违反
唯一约束

有两种解决方案可以避免序列化
FirstName
LastName
成员:

一个是我们可以使用Json.net
JsonProperty
属性忽略序列化中的空值:

公共类帐户
{
公共字符串电子邮件{get;set;}
[Newtonsoft.Json.JsonProperty(NullValueHandling=NullValueHandling.Ignore)]
公共字符串名{get;set;}
[Newtonsoft.Json.JsonProperty(NullValueHandling=NullValueHandling.Ignore)]
公共字符串LastName{get;set;}
}
另一种方法是使用匿名对象作为搜索表达式:

arangoDatabase.Query()
.Upsert(=>newaccount(){Email=insert.Email}
//应该是
arangoDatabase.Query()
.Upsert(=>new{Email=insert.Email}
关于使用匿名对象的一个注意事项是,
Email
成员可以根据您为其命名约定指定的内容解析为其他内容,例如:

公共类帐户
{
[DocumentProperty(标识符=IdentifierType.Key)]
公共字符串电子邮件{get;set;}
公共字符串名{get;set;}
公共字符串LastName{get;set;}
}
如果指定
Email
作为密钥标识符,则应在匿名对象中使用
\u Key

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

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