LiteDB: Ungültiger BSON-Datentyp 'Null' im Feld '_id'

Using LiteDB, und es ist unglaublich. Es eignet sich gut zum Laden und Speichern von Daten, jedoch nicht für nachfolgende Ladevorgänge nach dem Erstellen der Datenbank.

Beim ersten Laden ist alles perfekt. Es erstellt die Datenbank und speichert den neuen Datensatz fehlerfrei. Die Abfrage wird leer zurückgegeben, da in dieser Sammlung noch nichts vorhanden ist.

Beim anschließenden Laden, nach dem Abfragen der Daten (funktioniert und erhält das Ergebnis), gibt es ein Problem in der.Update() was dieses Problem verursacht. Laut ihrer Dokumentation soll eine ID erstellt werden, wenn sie nicht angegeben wird. Wenn das Objekt aus der Auflistung zurückgegeben wird, enthält es dieses '_Id'-Feld nicht und kann daher den Datensatz in der Datenbank nicht aktualisieren.

public class AuctionCache
{
    public double lastModified { get; set; }
    public string server { get; set; }
    public AuctionCache() { }
}

private static bool IsCached(AuctionCache auction)
{
    string filename = string.Format("{0}-{1}.json", auction.server, auction.lastModified);
    bool cached = false;
    try
    {
        using (LiteDatabase db = new LiteDatabase("cache.db"))
        {
            // Get customer collection
            var auctions = db.GetCollection<AuctionCache>("auctions");

            // Use Linq to query documents
            try
            {
                var results = auctions.Find(x => x.server == auction.server).DefaultIfEmpty(null).Single();
                if (results == null)
                {
                    // Insert new cached server
                    auctions.Insert(auction);
                    auctions.EnsureIndex(x => x.server);
                }
                else
                {
                    if (results.lastModified < auction.lastModified)
                    {
                        // Update existing cached server data
                        results.lastModified = auction.lastModified;
                        auctions.Update(results);
                        auctions.EnsureIndex(x => x.server);
                    }
                    else
                    {
                        cached = File.Exists(filename);
                    }
                }
            }
            catch (LiteException le1) {
                Log.Output(le1.Message);
                // Get stack trace for the exception with source file information
                var st = new StackTrace(le1, true);
                // Get the top stack frame
                var frame = st.GetFrame(0);
                // Get the line number from the stack frame
                var line = frame.GetFileLineNumber();
                var module = frame.GetMethod();
                var file = frame.GetFileName();
            }
            catch (Exception e)
            {
                Log.Output(e.Message);
                // Get stack trace for the exception with source file information
                var st = new StackTrace(e, true);
                // Get the top stack frame
                var frame = st.GetFrame(0);
                // Get the line number from the stack frame
                var line = frame.GetFileLineNumber();
            }
        }
    } catch (Exception ee) {
        Log.Output(ee.Message);
        // Get stack trace for the exception with source file information
        var st = new StackTrace(ee, true);
        // Get the top stack frame
        var frame = st.GetFrame(0);
        // Get the line number from the stack frame
        var line = frame.GetFileLineNumber();
    }
    return cached;
}

Wenn Sie den obigen Code schnell verwenden möchten, können Sie Folgendes zu Demonstrationszwecken verwenden (anfängliches Laden):

   AuctionCache ac = new AuctionCache();
   ac.lastModified = (double)12345679;
   ac.server = "Foo";

   // should return true on subsequent loads.
   Console.WriteLine( IsCached( ac ) );

Stellen Sie beim Testen sicher, dass das Programm nach der ersten Erstellung gestoppt wird, und starten Sie dann das Programm 'fresh', um einen sauberen Test zum Laden / Aktualisieren der Datenbank mit folgendem Code durchzuführen:

   AuctionCache ac = new AuctionCache();
   ac.lastModified = (double)22345679;
   ac.server = "Foo";

   // should return true on subsequent loads.
   Console.WriteLine( IsCached( ac ) );

Dies sollte sicherstellen, dass versucht wird, den Datensatz zu aktualisieren und das Problem in Ihrer IDE als @ zu kennzeichnelastModified ist neuer als das in @ gespeichercache.db was das @ auslö.Update Methode in meinemIsCached Methode

Antworten auf die Frage(2)

Ihre Antwort auf die Frage