标签: litedb

LiteDB:字段'_id'上的BSON数据类型无效'Null'

使用LiteDB,这太棒了.它适用于加载和存储数据,但不适用于创建数据库后的后续加载.

在初始加载时,一切都很完美.它创建数据库并完美地存储新记录,并且查询返回空,因为该集合中尚不存在任何内容.

在后续加载时,在查询数据(工作并获得结果)之后,.Update()导致此问题的问题.根据他们的文档,当没有指定'Id'时,它应该创建一个.从集合返回对象时,它不包含此"_Id"字段,因此无法更新数据库中的记录.

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 …
Run Code Online (Sandbox Code Playgroud)

c# litedb

8
推荐指数
1
解决办法
6958
查看次数

如何在LiteDB-NoSQL中查看存储的数据

我正在学习LiteDB - NoSQL.我已经完成了基本的例子.当我构建它时,它将生成数据库文件.现在,我只想阅读此文件以查看我存储的数据.有可能读取它就像我们可以看到MSSQL中的数据一样吗?如何查看存储的数据?

任何帮助表示赞赏.谢谢.

.net nosql litedb

6
推荐指数
3
解决办法
1万
查看次数

从 LiteDB 获取数据

我想知道如何将 console.writeline 数据存储在我的 litedb 数据库文件中。这是我的 POCO 课程

[BsonId]
public int Id { get; set; }
public DateTime Updated { get; set; }
public DateTime Last { get; set; }
public override string ToString()
{
    return string.Format("Id : {0}, Updated : {1}, Last Message : {2}",
        Id,
        Updated,
        Last);
}
Run Code Online (Sandbox Code Playgroud)

我在数据库中插入信息:

using (var db = new LiteDatabase(_dbLocation))
{
    var hist = db.GetCollection<MailBoxInfo>("History");
    var mail = new MailBoxInfo
    {
        Updated = DateTime.Now,
        Last = datemsg
    };
    hist.Insert(mail);
    hist.EnsureIndex("Updated");
}
Run Code Online (Sandbox Code Playgroud)

最后,尝试输出它:

using (var …
Run Code Online (Sandbox Code Playgroud)

c# litedb

6
推荐指数
1
解决办法
3938
查看次数

LiteDB 的实体框架数据提供程序

我希望我的实体框架 Dbcontext 类能够使用不同的 -2 数据库。它使用各自的数据提供程序与 SQL Server、MySql、SQLite 一起正常工作。但无法获取 LiteDB(no-sql)的任何数据提供程序。是否有任何有关 LiteDB 实体框架的文章或示例代码。

entity-framework litedb

5
推荐指数
1
解决办法
4271
查看次数

获取列表中列表中的所有元素

我有以下数据模型:

    public class Customer
    {
        [BsonId]
        public int CustomerId { get; set; }
        public string Name { get; set; }
    }

    public class Order
    {
        [BsonId]
        public int OrderId { get; set; }
        [BsonRef("customers")] 
        public Customer Customer { get; set; }
    }

    public class Cart
    {
        [BsonId]
        public int CartID { get; set; }
        public List<Order> OrderList { get; set; }
    }
Run Code Online (Sandbox Code Playgroud)

现在我想通过查询我的购物车集合来访问客户。我尝试过这样的事情:

var collectionCarts = db.GetCollection<Cart>("carts");
var result = collectionCarts.Include("OrderList.Customer").Find(x => x.OrderList[0].Customer.CustomerId == 2);
Run Code Online (Sandbox Code Playgroud)

但是,所有尝试都会导致客户对象为空。我用 LiteDB-Viewer 检查的数据库似乎没问题。

c# litedb

4
推荐指数
1
解决办法
1万
查看次数

您是否只使用了一次 EnsureIndex(),或者对于您插入到数据库中的每个文档?

我正在学习如何使用 LiteDB。这是我用来将 .Net 对象插入数据库的一些 C# 代码:

     // Create new YacksProjectInfo object and insert it into the database
     YacksProjectInfo projectInfo = new YacksProjectInfo(AssemblyName, moduleNumber);
     yacksProjects.Insert(projectInfo);  // Id field generated automatically
     yacksProjects.EnsureIndex((YacksProjectInfo x) => x.ProjectName);
     yacksProjects.EnsureIndex((YacksProjectInfo x) => x.ModuleNumber);
Run Code Online (Sandbox Code Playgroud)

换句话说,每次向数据库添加新对象时,我都使用了EnsureIndex() 方法。但我猜这不是必需的,您只需要在插入第一个对象后执行一次。

有人可以确认是否需要每次都执行 ensureIndex() ,或者一次就足够了吗?

.net c# litedb

4
推荐指数
1
解决办法
2991
查看次数

DateTimeOffset:从 LiteDb 集合中获取数据时,TZ 偏移量重置为 +00:00

插入时,偏移量正常,但是检索文档时,它会重置为 +00:00

财产:

public DateTimeOffset CreatedOn { get; set; }
Run Code Online (Sandbox Code Playgroud)

插入:

user.CreatedOn = DateTimeOffset.Now; // 01/20/2021 6:05:21 PM +05:30
col.Insert(user);
col.EnsureIndex(x => x.Username);
Run Code Online (Sandbox Code Playgroud)

寻找:

using (var db = _liteDbConnection.Create() as LiteDatabase)
{
   var col = db.GetCollection<AuthUser>(USERS_COLLECTION);
   return col.FindOne(x => x.UserId == userId);
}
Run Code Online (Sandbox Code Playgroud)

user.CreatedOn变成

01/20/2021 6:05:21 PM +00:00

难道我做错了什么?

c# asp.net-mvc asp.net-core litedb

4
推荐指数
1
解决办法
669
查看次数

如何加入 LiteDb

我如何像 SQL 示例一样在 LiteDb 中的两个表之间加入:我有两个表 User 和 ActivityLog

这是模型

public class ActivityLog
{
    [BsonId]
    public int Id { get; set; }
    public string UserId { get; set; }
    public string Action { get; set; }
    public DateTime ActionDateTime { get; set; }
}


public class User
{
    [BsonId]
    public int Id { get; set; }
    public string UserId { get; set; }
    public string UserName { get; set; }
    public DateTime LoginDate { get; set; }

}
Run Code Online (Sandbox Code Playgroud)

我需要加入 Activity.UserID = …

c# linq c#-3.0 c#-4.0 litedb

1
推荐指数
1
解决办法
2747
查看次数

LiteDb - 文件存储搜索

我正在考虑使用 LiteDb for C# 作为文档存储系统。

只要我知道文件的 ID,我就可以上传和下载 - 但我也希望能够选择搜索它。

LiteDb 文档提供了此命令,用于搜索存储在 Db 内特定“目录”中的所有文件;

 var files = db.FileStorage.Find("$/photos/2014/");
Run Code Online (Sandbox Code Playgroud)

但是我不知道如何处理 files 变量。我无法将其转换为可用的字符串等。

例如,我想将其添加到列表视图中。

有人有使用 LiteDb 和文件搜索的经验吗?

c# nosql litedb

1
推荐指数
1
解决办法
2417
查看次数

如何正确实现为异步使用而设计的接口?

从以下(简化)接口开始,考虑到async/await,我想通过使用LiteDB数据库来实现它.

public interface IDataService
{
    Task<User> GetUserAsync(int key);
}
Run Code Online (Sandbox Code Playgroud)

不幸的是,LiteDB目前不支持异步方法.所有方法都是同步的.

我尝试了以下内容,但后来遇到了一些问题(进程并没有真正等待任何原因).接下来,我读到你应该只Task.Run()用于CPU绑定算法,因此不能用于数据库访问.

public Task<User> GetUserAsync(int key)
{
    var task = Task.Run(() =>
    {
        return _users
            .Find(x => x.Key == key)
            .SingleOrDefault();
    });
    return task;
}
Run Code Online (Sandbox Code Playgroud)

即使我阅读了几篇博客文章和SO问题,我仍然不清楚如何为基于同步IO的代码制作一个正确编写的等待方法.

那么我该如何编写一个正确的等待方法呢?

注意:我无法更改界面.这是给出的.

c# async-await litedb

1
推荐指数
1
解决办法
510
查看次数

获取 LiteDB c# .net 中的最新插入

我正在努力创建一种方法,将最后一个事务插入到 litedb 中。

我确实有一个日期字符串,已保存。

这是课程:

public class TransactionPair : TransactionTwo
{
    private string returnT;
    public TransactionPair() { /* making an empty declaration so we don't NEED to pass it anything if we don't want. */}

    public TransactionPair(string returnT, string request)
    {
        this.returnT = returnT;
        JObject o = JObject.Parse(returnT);
        AuthCode = o.GetValue("AuthoCode").ToString();
        TransType = o.GetValue("TransType").ToString();
        AmountString = o.GetValue("AmountString").ToString();
        CardType = o.GetValue("CardType").ToString();
        Last4 = o.GetValue("Last4").ToString();
        RefID = o.GetValue("RefID").ToString();
        CardToken = o.GetValue("CardToken").ToString();
        ExpDate = o.GetValue("ExpDate").ToString();
        DateString = DateTime.Now.ToString("d-MMM-yyyy:HH:mm:ss.f", DateTimeFormatInfo.InvariantInfo);
        Request = request;
    } …
Run Code Online (Sandbox Code Playgroud)

.net c# linq litedb

1
推荐指数
1
解决办法
3231
查看次数

获取错误 System.IO.IOException: '进程无法访问文件'

我正在开发一个带有多线程的小应用程序。我决定使用 LiteDB 来存储数据。我能够成功读取、更新、删除和插入我的数据库。但是,当我尝试添加另一个线程时,该线程也将使用相同的数据库和相同的表抛出异常说

System.IO.IOException: '进程无法访问文件'C:\Users\Soyuz\TestApp\bin\Debug\Soyuz.db',因为它正被另一个进程使用。'。

这就是我与数据库建立连接的方式:

using (var db = new LiteDatabase(@"Soyuz.db")) { }
Run Code Online (Sandbox Code Playgroud)

这里的文档说,LiteDB 提供 2 种类型的连接。我想我必须使用共享的,因为我必须从不同的线程访问同一个数据库。

https://www.litedb.org/docs/connection-string/

但是当我尝试这段代码时;

using (var db = new LiteDatabase(@"Soyuz.db; Connection=shared")) { }
Run Code Online (Sandbox Code Playgroud)

或者

using (var db = new LiteDatabase(@"Soyuz.db; Mode=Shared")) { }
Run Code Online (Sandbox Code Playgroud)

这一次,它抛出另一个异常说

System.ArgumentException: 'EngineSettings 必须将 Filename 或 DataStream 作为数据源'

有 LiteDB 经验的人可以帮我解决这个问题吗?

c# multithreading litedb

1
推荐指数
1
解决办法
1484
查看次数