1

我正在实现 CRUD 接口的 UPDATE 部分,并使用 LiteDB 来存储我的对象集合。

我存储的对象是 Schedules,而 Schedule.ScheduleName 是集合上的索引。Schedule.ScheduleName 是类型的 [BsonId]。

我的更新方法非常简单:

    public bool UpdateSchedule(Schedule schedule, string scheduleID)
    {
        return scheduleCollection.Update(scheduleID, schedule);
    }

但是,这会达到我的预期吗?如果提供的调度对象中有新名称,而 schjeduleID 是旧名称,我希望它会在 scheduleID 下找到旧条目,并使用新调度对象中的任何内容对其进行更新。但会吗?

如果是这样,那是实现 CRUD 的 U 部分的正确方法吗?我的语义正确吗?我想不出任何其他方式来重命名或更改对象的 ID!

4

1 回答 1

0

在 LiteDB 中不可能更改_id值,因为这_id用于在数据库中查找您的文档。

仅当您的实体(POCO 类)在序列化后没有值Update(BsonValue id, T entity)时才能使用此更新签名。_id

public bool Update(BsonValue id, T document)
{
    if (document == null) throw new ArgumentNullException("document");
    if (id == null || id.IsNull) throw new ArgumentNullException("id");

    // get BsonDocument from object
    var doc = _mapper.ToDocument(document);

    // set document _id using id parameter
    doc["_id"] = id;

    return _engine.Value.Update(_name, new BsonDocument[] { doc }) > 0;
}

这样做的原因是因为_id索引(PK)没有在更新命令中重新构建。如果您与传统数据库(如 SQL Server/Oracle)进行比较,它们Row_Id也无法更改。

于 2017-11-10T13:08:17.083 回答