Uplet在LiteDB中不起作用

时间:2018-01-28 12:45:59

标签: c# .net 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:&#39;无法在唯一索引中插入重复键&#39; a&#39;。重复值为&#34;&#34;&#34;&#39;&#39;

插入或更新 Upsert (如果存在)?

2 个答案:

答案 0 :(得分:1)

您的StringPair类是否包含唯一的Id属性(_id字段)。 LiteDB使用PK索引(_id字段)来检查是否存在文档插入或更新。 试试这个类结构:

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

答案 1 :(得分:0)

如果您通过使用属性BsonIdAttribute告诉LiteDb引擎应该将类的哪些属性视为ID,则可以轻松保留类结构:

public sealed class StringPair
{
    [BsonId]
    public string First { get; set; }
    public string Second { get; set; }
}