ArangoDb.Net upsert始终插入
我正在用ArangoDatabase及其驱动程序制作一个带有CRUD函数的小应用程序: 这是我的密码:ArangoDb.Net upsert始终插入,arangodb,Arangodb,我正在用ArangoDatabase及其驱动程序制作一个带有CRUD函数的小应用程序: 这是我的密码: var insert = new Account { Email = "email01@gmail.com", FirstName = "Adam", LastName = "Smith" }; var update = new Account
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.netJsonProperty
属性忽略序列化中的空值:
公共类帐户
{
公共字符串电子邮件{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