NserviceBus未加载现有saga数据

NserviceBus未加载现有saga数据,nservicebus,saga,Nservicebus,Saga,我已经使用nservice总线saga实现了一个my连接器。下面是代码 public class ClientSaga : Saga<ClientSagaState>, IAmStartedByMessages<ClientChangeMessage>, IAmStartedByMessages<ClientContactChangeMessage>, IAmStartedBy

我已经使用nservice总线saga实现了一个my连接器。下面是代码

    public class ClientSaga : Saga<ClientSagaState>, 
            IAmStartedByMessages<ClientChangeMessage>, 
            IAmStartedByMessages<ClientContactChangeMessage>,
            IAmStartedByMessages<ClientPictureChangeMessage>, 
            IHandleTimeout<ClientSagaState>
        {
            [SetterProperty]
            public IClientContactChangeDb ClientContactChangeDb{get;set;}

            [SetterProperty]
            public IBusRefTranslator BusRefTranslator{get;set;}



            public void Handle(ClientContactChangeMessage message)
            {
                var state=this.Data;
                //Some handling logic
                //Check if client is not in database then store the state
                state.ClientContactChange=message;
                state.ClientRef =message.ClientRef;
                //if client is in the data base then 
                MarkAsComplete();
            }

            public void Handle(ClientChangeMessage message)
            {
                 var state=this.data;
                //Update or create the client depending on the situation
                //check for dependencies
                if(state.ClientContactChange !=null)
                {
                     //Handle the contact change
                } 
                else
                 {
                   state.ClientChangeMessage=message;
                    state.ClientRef=message.ClientRef;
                   }
            }
              public void Handle(ClientPictureChangeMessage message)
            {
                     var state=this.Data;
                 //If the client is there then update the picture else store in saga
                   state.ClientPictureChangeMessage =message;
                    state.ClientRef=message.ClientRef;
                   }
            }

            public override void ConfigureHowToFindSaga()
            {
                ConfigureMapping<ClientContactChangeMessage>(s => s.ClientRef, m => m.ClientRef);
                ConfigureMapping<ClientPictureChangeMessage>(s => s.ClientRef, m => m.ClientRef);
                ConfigureMapping<ClientChangeMessage>(s => s.ClienttnRef, m => m.Id);
            }
        }


        public class ClientSagaState: IContainSagaData
        {
            //i dont need these three fields
            public Guid Id { get; set; }
            public string Originator { get; set; }
            public string OriginalMessageId { get; set; }

           // the fields which i needed
           public Guid ClientRef {gee; set;}
           public ClientChangeMessage ClientChange {get;set;}
           public ClientContactChange ClientContactChange {get;set;}
           public ClientPictureChangeMessage  ClientPictureChangeMessage {get;set;}
        }
公共类客户端Saga:Saga,
我开始发短信,
我开始发短信,
我开始发短信,
我把它拿出来
{
[SetterProperty]
公共IClientContactChangeDb客户端ContactChangeDB{get;set;}
[SetterProperty]
公共IBusRefTranslator BusRefTranslator{get;set;}
公共无效句柄(ClientContactChangeMessage)
{
var state=此.Data;
//一些处理逻辑
//检查客户端是否不在数据库中,然后存储状态
state.ClientContactChange=消息;
state.ClientRef=message.ClientRef;
//如果客户机在数据库中,则
MarkAsComplete();
}
公共无效句柄(ClientChangeMessage消息)
{
var state=此.data;
//根据情况更新或创建客户端
//检查依赖项
if(state.ClientContactChange!=null)
{
//处理联系人变更
} 
其他的
{
state.ClientChangeMessage=消息;
state.ClientRef=message.ClientRef;
}
}
公共无效句柄(ClientPictureChangeMessage)
{
var state=此.Data;
//如果客户机在那里,则更新saga中的图片else存储
state.ClientPictureChangeMessage=消息;
state.ClientRef=message.ClientRef;
}
}
公共覆盖无效配置HowtoFindsaga()
{
配置映射(s=>s.ClientRef,m=>m.ClientRef);
配置映射(s=>s.ClientRef,m=>m.ClientRef);
配置映射(s=>s.ClienttnRef,m=>m.Id);
}
}
公共类ClientSagaState:IContainSagaData
{
//我不需要这三个字段
公共Guid Id{get;set;}
公共字符串发起者{get;set;}
公共字符串OriginalMessageId{get;set;}
//我需要的田地
公共Guid ClientRef{gee;set;}
公共ClientChangeMessage ClientChange{get;set;}
public ClientContactChange ClientContactChange{get;set;}
公共客户端PictureChangeMessage客户端PictureChangeMessage{get;set;}
}
现在,在我的连接器中,无法创建客户端,而不存在客户端联系人更改消息

佐贺失败的案例:

  • 当我首先向客户端发送图片消息时,它会创建一个新的 传奇故事和存储它
  • 然后我发送一条客户变更消息,它创建了另一个传奇故事 存储它,即找不到客户图片创建的传奇 信息
  • 然后我发送客户联系人更改消息,它会以某种方式找到 由客户图片更改创建的传奇,但现在找不到工作人员
  • 我不明白为什么会发生这种事

    佐贺成功的案例:

  • 当我第一次发送客户端更改消息时,它创建了一个传奇
  • 然后我发送客户联系方式更改消息,它会找到传奇故事 而且执行得很好
  • 谁能解释一下为什么会发生这种行为

    如果需要更多信息,请告诉我

    谢谢

    更新


    在再次检查代码时,我找到了原因。我的ClientChangeMessage也继承了IContainSaga数据(我正在尝试但忘记删除)。删除继承链接后,一切正常。(羞愧地垂着头)

    在所有处理程序中,您需要在Saga数据上设置ClientRef。 所以,你应该:

      public void Handle(ClientContactChangeMessage message)
            {
                Data.ClientRef = message.ClientRef
                ...
            }
    
    由于这些消息中的任何一条都可以启动传奇,因此您需要在传奇状态中设置此值。当其他消息进来时,它将被这个id关联起来,因为已经有一个具有这个id的传奇实例


    要引用您的传奇状态变量,请使用数据。尽管如此。

    很抱歉,我忘了提到这一点,但如果我在数据库中找不到客户机,我会在每个处理程序中设置this.Data.ClientRef(我在上面做了一些更改)。当客户端更改消息到达时,nservicebus仍然无法加载客户端图片更改传奇。如果我在ClientRef上添加了一个unique属性,那么当客户端消息到达时,连接器会失败,错误为unique key constraint error。正如@simon所建议的,您可以在某个地方发布您的问题的报告以查看吗?谢谢。看起来ClientChangeMessage是通过Id而不是ClientRef查找的,这是问题所在吗?在客户端更改消息的情况下,Id和客户端引用是相同的。对不起,我忘记提了that@sa1986你能把复印件上传到什么地方吗?