[英]ArangoDb.Net upsert always insert
我正在使用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();
}
首次運行時,[插入]對象被添加到數據庫中。 因此,我的數據庫現在是:
但是在第二次運行代碼時,它引發了一個錯誤:
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
。
有兩種解決方案可以避免序列化FirstName
和LastName
成員:
一種是我們可以使用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.