Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/redis/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
.net core 将数据从LiteDb查询复制到列表会导致System.InvalidOperationException_.net Core_Litedb - Fatal编程技术网

.net core 将数据从LiteDb查询复制到列表会导致System.InvalidOperationException

.net core 将数据从LiteDb查询复制到列表会导致System.InvalidOperationException,.net-core,litedb,.net Core,Litedb,我一直在使用LiteDb来提高数据源的性能。提要在Azure数据库上运行,为了减少我们使用的DTU和连接数量(我在并行forach循环中执行一些逻辑),我从数据库中提取数据,将其放入LiteDb索引,然后围绕它运行我的逻辑。 我的大部分场景都很好。我首先执行插入批量添加索引,然后以只读模式重新打开litdb并运行查询 像这样的 using (var db = new LiteDatabase("SiloLite.db")) {

我一直在使用LiteDb来提高数据源的性能。提要在Azure数据库上运行,为了减少我们使用的DTU和连接数量(我在并行forach循环中执行一些逻辑),我从数据库中提取数据,将其放入LiteDb索引,然后围绕它运行我的逻辑。 我的大部分场景都很好。我首先执行插入批量添加索引,然后以只读模式重新打开litdb并运行查询 像这样的

using (var db = new LiteDatabase("SiloLite.db"))
                {
                    db.DropCollection("SiloProduct");
                    var products = db.GetCollection<SiloProduct>("SiloProduct");
                    products.InsertBulk(_siloproductRepository.Table.ToList());
                    products.EnsureIndex(x => x.Sku);
                    db.Engine.EnsureIndex("SiloProduct", "UniqueProdId", "$.Sku+';'+$.ParentProductId", true);
                }
using (var db = new LiteDatabase($"Filename={AppDomain.CurrentDomain.BaseDirectory}\\SiloLite.db;mode=ReadOnly"))
                {
                    var products = db.GetCollection<SiloProduct>("SiloProduct");
                    var manufacturers = db.GetCollection<SiloManufacturer>("SiloManufacturer");
                    var productspecificationmap =
                        db.GetCollection<SiloProductSpecificationAttributeMapping>(
                            "SiloProductSpecificationAttributeMapping");
                    var specificationAttributes =
                        db.GetCollection<SiloSpecificationAttribute>("SiloSpecificationAttribute");
                    var specificationAttributeOptions =
                        db.GetCollection<SiloSpecificationAttributeOption>("SiloSpecificationAttributeOption");

                    Parallel.ForEach(katartlist, KatartItem =>
                    {
                        SaveData(KatartItem, specificationAttributes, specificationAttributeOptions, productspecificationmap,
                            manufacturers, products);
                    });
                    _logger.Information("Completed updating Product Specifications");
                }

不确定我在这里做错了什么。任何指针都会有帮助。

我必须解决一个类似的问题,在这个问题中,我从LiteDB读取数据,然后将数据放入另一个列表中。我这样写我的并行执行解决了这个问题:

public static async Task LoadDataFromDB()
{
    var tasks = new List<Task>();

    using (var db = new LiteDatabase(fullDbPath))
    {
        var bookChapterCollection = db.GetCollection<Chapter>("bookData");
        foreach (var volume in Volume.ListOfVolumes)
        {
            tasks.Add(Task.Factory.StartNew(() =>
            {
                var volumeChapterFromDB = bookChapterCollection.Find(x => x.chapterVolume == volume.volume).toList();
                return volumeChapterFromDB;
            }
            ,TaskCreationOptions.LongRunning)
           .ContinueWith(task => {
                BookChaptersBag.Add(task.Result);
                return task.Result;
            })
            );
        }
        await Task.WhenAll(tasks).ContinueWith(task =>
        {
            BookChaptersBag.CompleteAdding();
        });
    }
}
公共静态异步任务LoadDataFromDB()
{
var tasks=新列表();
使用(var db=new LiteDatabase(fullDbPath))
{
var bookChapterCollection=db.GetCollection(“bookData”);
foreach(卷中的var卷。ListOfVolumes)
{
tasks.Add(Task.Factory.StartNew(()=>
{
var volumeChapterFromDB=bookChapterCollection.Find(x=>x.chapterVolume==volume.volume.toList();
返回volumeChapterFromDB;
}
,TaskCreationOptions.LongRunning)
.ContinueWith(任务=>{
BookChaptersBag.Add(task.Result);
返回任务。结果;
})
);
}
等待任务。当所有(任务)。继续(任务=>
{
BookChaptersBag.CompleteAdding();
});
}
}
这里BookChaptersBag是一个
BlockingCollection
,它是System.Collections.Concurrent命名空间中的线程安全集合。 在像上面那样编写并行执行之后,我停止了获取异常

希望这有帮助

System.InvalidOperationException: Operations that change non-concurrent collections must have exclusive access. A concurrent update was performed on this collection and corrupted its state. The collection's state is no longer correct.
   at System.Collections.Generic.Dictionary`2.FindEntry(TKey key)
   at System.Collections.Generic.Dictionary`2.TryGetValue(TKey key, TValue& value)
   at LiteDB.CacheService.GetPage(UInt32 pageID)
   at LiteDB.PageService.GetPage[T](UInt32 pageID)
   at LiteDB.QueryCursor.Fetch(TransactionService trans, DataService data, BsonReader bsonReader)
   at LiteDB.LiteEngine.Find(String collection, Query query, Int32 skip, Int32 limit)+MoveNext()
   at LiteDB.LiteEngine.Find(String collection, Query query, String[] includes, Int32 skip, Int32 limit)+MoveNext()
   at LiteDB.LiteCollection`1.Find(Query query, Int32 skip, Int32 limit)+MoveNext()
   at System.Linq.Enumerable.TryGetFirst[TSource](IEnumerable`1 source, Boolean& found)
   at CreateOrUpdateProductSpecifications(KatartItem katartItem, VarData vd, SiloManufacturer manufacturer, SiloProduct product, LiteCollection`1 liteSpecCollection, LiteCollection`1 liteSpecOptCollection, LiteCollection`1 liteProdSpecCollection) in *** 1399
public static async Task LoadDataFromDB()
{
    var tasks = new List<Task>();

    using (var db = new LiteDatabase(fullDbPath))
    {
        var bookChapterCollection = db.GetCollection<Chapter>("bookData");
        foreach (var volume in Volume.ListOfVolumes)
        {
            tasks.Add(Task.Factory.StartNew(() =>
            {
                var volumeChapterFromDB = bookChapterCollection.Find(x => x.chapterVolume == volume.volume).toList();
                return volumeChapterFromDB;
            }
            ,TaskCreationOptions.LongRunning)
           .ContinueWith(task => {
                BookChaptersBag.Add(task.Result);
                return task.Result;
            })
            );
        }
        await Task.WhenAll(tasks).ContinueWith(task =>
        {
            BookChaptersBag.CompleteAdding();
        });
    }
}