Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/fortran/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
ApacheIgnite.NET2.8.1:与QueryEntity的亲和性搭配_Ignite - Fatal编程技术网

ApacheIgnite.NET2.8.1:与QueryEntity的亲和性搭配

ApacheIgnite.NET2.8.1:与QueryEntity的亲和性搭配,ignite,Ignite,我正在Windows10机器上使用ApacheIgniteV.2.8.1.Net 我正在尝试在启用查询的缓存上使用关联搭配。我存储在缓存中的实体有一个名为Id的主键和一个名为PartnerId的关联键。两个键的类型均为Int32。我将缓存定义如下: new CacheConfiguration("BespokeCharge") { KeyConfiguration = new[] {

我正在Windows10机器上使用ApacheIgniteV.2.8.1.Net

我正在尝试在启用查询的缓存上使用关联搭配。我存储在缓存中的实体有一个名为Id的主键和一个名为PartnerId的关联键。两个键的类型均为Int32。我将缓存定义如下:

new CacheConfiguration("BespokeCharge")
        {
            KeyConfiguration = new[]
            {
                    new CacheKeyConfiguration()
                    {
                        AffinityKeyFieldName = "PartnerId",
                        TypeName = typeof(BespokeCharge).Name
                    }
            }
        };
接下来,我使用以下代码添加数据:

var cache = Ignite.GetCache<AffinityKey, BespokeCharge>("BespokeCharge")
cache.Put(new AffinityKey(entity.Id, entity.PartnerId), entity)
当我运行代码时,Ignite和我的应用程序都会崩溃,并记录以下错误:

JVM将由于以下故障立即停止:[failureCtx=FailureContext[type=CRITICAL_ERROR,err=class o.a.i.i.processors.cache.persistence.tree.CorruptedTreeException:B+树已损坏[pagesgroupId,pageId=[IgniteBitute[val1=1565129718,val2=844420635164729]],cacheId=-1278247946,cacheName=BESPOKECHARGES,indexName=BESPOKECHARGES\u ID\u ASC\u IDX,msg=行上的运行时故障:Row@29db2fbe[key:AffinityKey[idHash=8137191,hash=783909474,key=3,affKey=2],val:UtilityClick.BillValidation.Shared.InMemory.Model.BespokeCharge[idHash=889383506,hash=-399638125,BespokeChargeTypeId=4,ChargeValue=100.0000,ChargeValueInCommission=100.0000,Id=3,PartnerId=2,QuoteRecordId=5][4100.0000,100.0000,2,5]]

当我试图用int键类型而不是AffinityKey来定义QueryEntity时,我得到了一个不同的错误,结果是相同的——崩溃

JVM将由于以下故障而立即停止:[failureCtx=FailureContext[type=CRITICAL_ERROR,err=java.lang.ClassCastException:class o.a.i.cache.affinity.AffinityKey无法强制转换为class java.lang.Integer o.a.i.cache.affinity.AffinityKey位于加载器“app”的未命名模块中;java.lang.Integer位于加载器“bootstrap”的java.base模块中]]

我做错了什么?感谢您的帮助!

KeyFieldName=Id设置是个问题。它将Id字段设置为用作缓存键,即int,但随后我们将AffinityKey用作缓存键,这会导致类型不匹配


在这种情况下,我认为我们根本不需要KeyFieldName,删除它可以解决问题,选择查询不应受到此更改的影响。

您可以尝试使用typeofT.FullName而不是typeofT.Name吗?@PavelTupitsyn谢谢,可以。t是BespokeCharge抱歉,我忘了用真正的实体类型替换t以进行Clarify让我知道它是怎么回事。如果有一个复制程序就太好了-Ignite中肯定有一些bug-它不应该仅仅因为配置错误而使JVM崩溃。@PavelTupitsyn我得到了与上面相同的错误,B+树已损坏。@PavelTupitsyn我将尝试创建一个复制程序项目。谢谢,我会尝试。SQL引擎如何知道Id字段是f的键如果我没有明确地指定它?是否有某种约定来考虑EF中的名称ID关键字字段的所有字段?再次感谢,这解决了问题。但是另一个问题出现了:用键和亲和密钥构造LINQ/SQL查询的正确方法是什么?它是正确的LINQ查询吗?query=cache.AsCacheQueryable;var result=query.Wherem=>m.Value.Id==1&&m.Value.PartnerId==1.FirstOrDefault?.Value;@AlexAvrutin只需按原样使用键:cache.Querynew SqlFieldsQueryselect*from BespokeCharge,其中(键=?),new AffinityKeyid,PartnerId或withLINQ var key=new AffinityKeybespokeCharge.Id,bespokeCharge.PartnerId;var qry=cache.AsCacheQueryable.Wherep=>p.key==key;@AlexAvrutin如果缓存键出现在上面的where子句中,Ignite会帮你找到它。或者你是说别的什么?你可以在实体中去掉Id和PartnerId,因为它们出现在ke中y,但在本例中,您必须使用自定义键类而不是预定义的AffinityKey,以便Id和PartnerId标记为[QuerySqlField],并在SQL中可用。
new CacheConfiguration("BespokeCharge",
            new QueryEntity(typeof(AffinityKey), typeof(BespokeCharge))
            {
                KeyFieldName = "Id",
                TableName = "BespokeCharge"
            })
        {
            KeyConfiguration = new[]
            {
                    new CacheKeyConfiguration()
                    {
                        AffinityKeyFieldName = "PartnerId",
                        TypeName = typeof(BespokeCharge).Name
                    }
            }
        };