Upsert 在 LiteDB 中不起作用
Upsert is not functioning in LiteDB
我正在尝试做这样的事情:
db = new LiteDatabase(@"albumdata.db");
db_string = db.GetCollection<StringPair>("strings");
db.Engine.EnsureIndex("strings", "a", true);
db_string.Upsert(new StringPair("a", "1"));
// this line throws this exception : LiteDB.LiteException: 'Cannot insert duplicate key in unique index 'a'. The duplicate value is '"a"'.'
db_string.Upsert(new StringPair("a", "1"));
但如代码中所述,我收到此错误:LiteDB.LiteException:'无法在唯一索引 'a' 中插入重复键。重复值是'"a"'。'
是否 Upsert for insert or update 如果它存在?
是你的StringPair
class包含一个唯一的Id属性(_id
字段)。 LiteDB 使用 PK 索引(_id
字段)来检查是否存在文档进行插入或更新。
试试这个 class 结构:
public class StringPair
{
public StringPair(string a, string b)
{
this.Id = a;
this.OtherField = b;
}
public StringPair()
{
// don't forgot parameterless ctor
}
// Define "Id" or use [BsonId] in your property or use FluentApi mapper
public string Id { get; set; }
public string OtherField { get; set; }
}
db = new LiteDatabase(@"albumdata.db");
db_string = db.GetCollection<StringPair>("strings");
// PK already contains unique index
// db.Engine.EnsureIndex("strings", "a", true);
db_string.Upsert(new StringPair("a", "1")); // insert
db_string.Upsert(new StringPair("a", "2")); // update
如果你告诉 LiteDb 引擎你 class 中的 属性 应该被视为 id,你可以轻松地保留你的 class 结构,在其上使用属性 BsonIdAttribute
:
public sealed class StringPair
{
[BsonId]
public string First { get; set; }
public string Second { get; set; }
}
我正在尝试做这样的事情:
db = new LiteDatabase(@"albumdata.db");
db_string = db.GetCollection<StringPair>("strings");
db.Engine.EnsureIndex("strings", "a", true);
db_string.Upsert(new StringPair("a", "1"));
// this line throws this exception : LiteDB.LiteException: 'Cannot insert duplicate key in unique index 'a'. The duplicate value is '"a"'.'
db_string.Upsert(new StringPair("a", "1"));
但如代码中所述,我收到此错误:LiteDB.LiteException:'无法在唯一索引 'a' 中插入重复键。重复值是'"a"'。'
是否 Upsert for insert or update 如果它存在?
是你的StringPair
class包含一个唯一的Id属性(_id
字段)。 LiteDB 使用 PK 索引(_id
字段)来检查是否存在文档进行插入或更新。
试试这个 class 结构:
public class StringPair
{
public StringPair(string a, string b)
{
this.Id = a;
this.OtherField = b;
}
public StringPair()
{
// don't forgot parameterless ctor
}
// Define "Id" or use [BsonId] in your property or use FluentApi mapper
public string Id { get; set; }
public string OtherField { get; set; }
}
db = new LiteDatabase(@"albumdata.db");
db_string = db.GetCollection<StringPair>("strings");
// PK already contains unique index
// db.Engine.EnsureIndex("strings", "a", true);
db_string.Upsert(new StringPair("a", "1")); // insert
db_string.Upsert(new StringPair("a", "2")); // update
如果你告诉 LiteDb 引擎你 class 中的 属性 应该被视为 id,你可以轻松地保留你的 class 结构,在其上使用属性 BsonIdAttribute
:
public sealed class StringPair
{
[BsonId]
public string First { get; set; }
public string Second { get; set; }
}