我可以将IdeaBlade连接到两个相似的数据源,但是使用相同的模型吗?

时间:2018-07-25 17:39:03

标签: c# winforms devforce

在我当前的项目中,我试图在用户计算机上存储远程数据库的本地副本,以便在客户失去互联网连接的情况下,他们仍然可以访问其数据,并且可以在脱机时创建/更新数据。远程和本地之间的数据库模式是完全相同的,因此我们真的不应该需要一个新模型来让两个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));

1 个答案:

答案 0 :(得分:1)

您可以使用数据源密钥扩展来完成此操作。您只需要一个Object Mapper模型-假设它使用的数据源名称为“默认”。在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>

创建PersistenceManager时,需要指示要使用的扩展名以及“ PersistenceServiceOption”。此选项告诉PM是查看配置文件中的远程信息还是忽略它。例如:

 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中),以确保您的代码正确处理了扩展名。