C# 我的Dropbox上的嵌入式Raven DataDirectory无法100%工作?

C# 我的Dropbox上的嵌入式Raven DataDirectory无法100%工作?,c#,ravendb,C#,Ravendb,我的Dropbox文件夹里有我的项目文件,所以我也可以在办公室里玩我的文件 我的项目包含一个EmbeddedBleDocumentStore,其中UseMbeddedHttpServer设置为true const int ravenPort = 8181; NonAdminHttp.EnsureCanListenToWhenInNonAdminContext(ravenPort); var ds = new EmbeddableDocumentStore { DataDirectory

我的Dropbox文件夹里有我的项目文件,所以我也可以在办公室里玩我的文件

我的项目包含一个
EmbeddedBleDocumentStore
,其中
UseMbeddedHttpServer
设置为
true

const int ravenPort = 8181;
NonAdminHttp.EnsureCanListenToWhenInNonAdminContext(ravenPort);
var ds = new EmbeddableDocumentStore { 
    DataDirectory = "Data", 
    UseEmbeddedHttpServer = true, 
    Configuration = { Port = ravenPort } 
};
现在,当我在office pc上启动我的项目的这一天,我看到这样一条消息:
无法打开事务存储:D:\Dropbox\…\Data

由于这是在我的早期开发阶段,我删除了我的Dropbox上的数据文件夹,项目完美地开始了。现在我回到家里,我遇到了同样的问题!当然,我不想每次都删除这个文件夹


我不能将开发数据存储在Dropbox上吗?我是否应该绕过某个操作以使其正常工作?

将数据目录设置为本地计算机上的物理磁盘卷。您将无法使用任何类型的映射驱动器、网络共享、UNC路径、dropbox或skydrive作为数据目录。仅仅因为你有一个驱动器号并不意味着你有一个物理磁盘

唯一有意义的非物理存储类型是通过iSCSI或光纤通道从SAN连接的LUN,或虚拟化或云环境中连接的VHD。它们都将作为物理磁盘提供给操作系统

几乎任何数据访问环境都是如此。如果您不相信我,请尝试使用SQL Server。在RavenDB的例子中,它使用ESENT作为其数据存储,这需要直接访问文件系统

更新

澄清一下,即使您存储在物理磁盘上,也不能依赖任何类型的同步技术,如DropBox或SkyDrive。为什么?因为他们将对文件进行共享读取锁定以监视更改。像ESENT(RavenDB的基础)这样的技术需要对文件进行独占锁定

SQL Server和Windows虚拟机等其他技术也对其数据存储进行独占锁定。为什么?因为他们不断地以随机访问的方式读取和写入数据位到文件中。您真的希望DropBox尝试对每一位数据更改执行同步操作吗?这将是非常低效和有问题的

使用共享锁的应用程序没有这个问题。例如,当您处理MS Word文档时,所有操作都是在内存中完成的。保存文件时,DropBox可以读取整个文件并将其同步到云。它可以通过只发送已更改的位来进行优化,但仍需要能够读取文件才能执行此操作


因此,如果DropBox在ESENT文件上有一个共享读取锁,那么当RavenDB尝试以独占方式打开它时,它会收到一个错误并引发您看到的异常。

将数据目录设置为本地计算机上的物理磁盘卷。您将无法使用任何类型的映射驱动器、网络共享、UNC路径、dropbox或skydrive作为数据目录。仅仅因为你有一个驱动器号并不意味着你有一个物理磁盘

唯一有意义的非物理存储类型是通过iSCSI或光纤通道从SAN连接的LUN,或虚拟化或云环境中连接的VHD。它们都将作为物理磁盘提供给操作系统

几乎任何数据访问环境都是如此。如果您不相信我,请尝试使用SQL Server。在RavenDB的例子中,它使用ESENT作为其数据存储,这需要直接访问文件系统

更新

澄清一下,即使您存储在物理磁盘上,也不能依赖任何类型的同步技术,如DropBox或SkyDrive。为什么?因为他们将对文件进行共享读取锁定以监视更改。像ESENT(RavenDB的基础)这样的技术需要对文件进行独占锁定

SQL Server和Windows虚拟机等其他技术也对其数据存储进行独占锁定。为什么?因为他们不断地以随机访问的方式读取和写入数据位到文件中。您真的希望DropBox尝试对每一位数据更改执行同步操作吗?这将是非常低效和有问题的

使用共享锁的应用程序没有这个问题。例如,当您处理MS Word文档时,所有操作都是在内存中完成的。保存文件时,DropBox可以读取整个文件并将其同步到云。它可以通过只发送已更改的位来进行优化,但仍需要能够读取文件才能执行此操作


因此,如果DropBox在ESENT文件上有一个共享读锁,那么当RavenDB尝试以独占方式打开它时,它会收到一个错误并引发您看到的异常。

DropBox不是本地驱动器上一个延迟同步的文件夹吗?就RavenDB而言,我认为它应该只是本地驱动器上的一个文件夹……是的,但ESENT需要在文件打开时对其进行独占锁定。它经常在这个文件中工作,就像SQL.mdf/.ldf文件或虚拟机的.vhd文件一样。DropBox/SkyDrive需要让开,以便获得锁。当然,一旦锁被释放,它就可以同步了。但我认为这样做不够聪明。它希望您使用的是可以使用共享锁的文档、图像和其他文件。我没有同时在两台计算机上调试,因此RavenDB引擎即使不再运行也会将其锁定?不,DropBox会。Raven无法打开其独占锁,因为DropBox已打开共享读取锁。如果您停止DropBox(如果它有这样做的机制),Raven应该可以。然后你可以在关闭Raven后启动DropBox来同步你的更改。DropBox不只是本地驱动器上一个延迟同步的文件夹吗?就RavenDB而言,我认为它应该只是本地驱动器上的一个文件夹……是的,但ESENT需要一个exclu