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