C# 我是否可以将iDeaBrade连接到两个类似的数据源,但使用相同的模型

C# 我是否可以将iDeaBrade连接到两个类似的数据源,但使用相同的模型,c#,winforms,devforce,C#,Winforms,Devforce,在我当前的项目中,我试图将远程数据库的本地副本存储在用户的计算机上,以便在客户失去互联网的情况下,他们仍然可以访问他们的数据,并可以在脱机时创建/更新数据。远程和本地之间的数据库模式是完全相同的,因此我们真的不需要一个新的模型来让两个persistencemanager同时运行,但是,到目前为止,我们尝试的方法还没有奏效。目前,我们创建指向远程数据库的主PersistenceManager,然后初始化第二个PersistenceManager以指向本地数据库,到目前为止,我们已经尝试了以下内容:

在我当前的项目中,我试图将远程数据库的本地副本存储在用户的计算机上,以便在客户失去互联网的情况下,他们仍然可以访问他们的数据,并可以在脱机时创建/更新数据。远程和本地之间的数据库模式是完全相同的,因此我们真的不需要一个新的模型来让两个persistencemanager同时运行,但是,到目前为止,我们尝试的方法还没有奏效。目前,我们创建指向远程数据库的主PersistenceManager,然后初始化第二个PersistenceManager以指向本地数据库,到目前为止,我们已经尝试了以下内容:

  • 在IdeaBlade.ibconfig中手动为LocalDB实例创建新的RdbKey
  • 使用对象映射器为LocalDB实例创建RdbKey
  • 在初始化主PersistenceManager后,更改默认RdbKey以指向本地数据库
我发现做这三个不同的任务都是同一个错误

Error No datasource key found for this entity type
Stack Trace    at IdeaBlade.Persistence.PersistenceManager.HandlePersistenceServerException(Exception pException, Boolean pTryToHandle, PersistenceOperation pOperation)
   at IdeaBlade.Persistence.PersistenceManager.XFetchDataSet(IEntityQuery pEntityQuery)
   at IdeaBlade.Persistence.PersistenceManager.XFetch(IEntityFinder pEntityFinder, WorkState pWorkState)
   at IdeaBlade.Persistence.PersistenceManager.XGetEntities(IEntityQuery pEntityQuery, QueryStrategy pQueryStrategy, WorkState pWorkState)
   at IdeaBlade.Persistence.PersistenceManager.GetEntities[T](IEntityQuery pEntityQuery, QueryStrategy pQueryStrategy)
   at SQLEmbeddedTesting.Form1.simpleButton1_Click(Object sender, EventArgs e) in c:\users\dev2\source\repos\SQLEmbeddedTesting\SQLEmbeddedTesting\Form1.cs:line 59
Inner Exception Number IdeaBlade.Util.IdeaBladeException: No datasource key found for this entity type
   at IdeaBlade.Persistence.Wcf.WcfPersistenceServerProxy.CheckConnection(Exception pException)
   at IdeaBlade.Persistence.PersistenceServerProxy.Fetch(SessionBundle pBundle, IEntityQuery pQuery)
   at IdeaBlade.Persistence.PersistenceManager.XFetchDataSet(IEntityQuery pEntityQuery)
Date Time: 7/25/2018 1:27:42 PM
是我做错了什么,还是我需要做一些特殊的事情来让它发挥作用。我发现实现这一点的唯一方法是在对象映射器中创建两个单独的键,并创建两个镜像模型,供两个PersistenceManager连接。然而,对于我们正在尝试的工作来说,这是非常低效的

以下是我目前尝试使用的代码:

IdeaBladeConfig config = IdeaBladeConfig.Instance;
config.Remoting.RemotePersistenceEnabled = false;
config.Remoting.RemoteBaseUrl = "SERVER_URL";
mPersMgr = new PersistenceManager(false);
mPersMgr.Connect();

config.Remoting.RemotePersistenceEnabled = false;
config.Remoting.RemoteBaseUrl = "127.0.0.1";
localPersMgr = new PersistenceManager(false, "default", PersistenceServiceOption.UseLocalService);
localPersMgr.Connect();

EntityList<Addresses> mainList = new EntityList<Addresses>();
EntityList<Addresses> localList = new EntityList<Addresses>();
RdbQuery query = new RdbQuery(typeof(Addresses));

mainList.ReplaceRange(mPersMgr.GetEntities<Addresses>(query, QueryStrategy.DataSourceOnly));
localList.ReplaceRange(localPersMgr.GetEntities<Addresses>(query, QueryStrategy.DataSourceOnly));
IdeaBladeConfig=IdeaBladeConfig.Instance;
config.Remoting.RemotePersistenceEnabled=false;
config.Remoting.RemoteBaseUrl=“服务器\ URL”;
mPersMgr=新的PersistenceManager(false);
mPersMgr.Connect();
config.Remoting.RemotePersistenceEnabled=false;
config.Remoting.RemoteBaseUrl=“127.0.0.1”;
localPersMgr=newPersistenceManager(false,“default”,PersistenceServiceOption.UseLocalService);
localPersMgr.Connect();
EntityList mainList=新EntityList();
EntityList localList=新EntityList();
RdbQuery query=新RdbQuery(地址类型));
ReplaceRange(mPersMgr.GetEntities(query,QueryStrategy.DataSourceOnly));
ReplaceRange(localPersMgr.GetEntities(query,QueryStrategy.DataSourceOnly));

您可以使用数据源密钥扩展来实现这一点。您只需要一个对象映射器模型——假设它使用的数据源名称为“default”。在ibconfig(或app.config)中,您确实需要两个RDBkey,但扩展名不同。例如:

  <rdbKey name="Default_Remote">
    <connection>remote db connection string</connection>
    ...
  </rdbKey>
  <rdbKey name="Default_Local">
    <connection>local db connection string</connection>
    ...
  </rdbKey>
 var pm_local = new PersistenceManager(true, "Local", PersistenceServiceOption.UseLocalService);
 var pm_remote = new PersistenceManager(true, "Remote", PersistenceServiceOption.UseDefaultService);
PersistenceServiceOption.UseDefaultService
选项指示它应该使用配置中的
remotePersistenceEnabled
设置;如果您知道总是指向BOS,也可以使用
UseRemoteService

您不应该在代码中更改IdeaBladeConfig.Instance信息,除了您可能希望执行的任何初始设置信息

如果您使用DataSourceKeyResolver来构建RdbKeys,则过程类似。使用数据源扩展来区分连接字符串和RdbKey构建

此外,请确保在任何可能查看RdbKeys的地方都仔细检查—例如在测试数据源适用性的自定义IdGenerator中—以确保代码正确处理扩展