如何在嵌入MVC时以编程方式初始化Raven FS FileStore

时间:2014-10-17 14:55:59

标签: ravendb asp.net-mvc-5.2 ravenfs

如果FS已初始化,我可以通过MVC应用程序中的FileStore实例连接到RavenDBServer,所以(例如),我创建RavenDBServer DataDirectory设置:

要明确:这是作为嵌入式实例运行的。

var config = new RavenConfiguration
{
    DataDirectory = "~\\App_Data\\Database",
    DatabaseName = "test"
};

var server = new RavenDbServer(config);
server.UseEmbeddedHttpServer = true;

然后转到Raven UI,添加名为test-fs的FS,将以下内容添加到初始化代码中:

server.FilesStore.DefaultFileSystem = "test-fs";
server.FilesStore.Initialize();

然后我打电话:

server.FileStore.OpenAsyncSession("test-fs");

我们一切都很好。

理想情况下,我不想这样做,因为它很麻烦,并涉及更改代码。所以。我把它放进去了:

server.FilesStore.AsyncFilesCommands.Admin.CreateOrUpdateFileSystemAsync(new FileSystemDocument(), "test-fs");

但是这永远不会在FileSystems文件夹中创建App_Data文件夹,任何OpenAsyncSession的尝试都会导致错误,指出无法打开test-fs

如何在初始化时创建FS?我在MVC(5.2)应用程序中执行此操作。

2 个答案:

答案 0 :(得分:2)

在RavenDB邮件列表中查看此thread

你可以这样做:

var store = new EmbeddableDocumentStore {
    RunInMemory = true,
    EnlistInDistributedTransactions = false
};
store.Initialize();
RavenServer = store;

var createFs = Task.Run(async () => {
    await store.FilesStore.AsyncFilesCommands.Admin.CreateOrUpdateFileSystemAsync(
    new FileSystemDocument {
        Settings = {
            { "Raven/FileSystem/DataDir", "~/App_Data/FileSystem/default" }
        }
    },
    "default"
    ).ConfigureAwait(false);
});
createFs.Wait();

下一个版本应该支持内存文件存储。

答案 1 :(得分:0)

我使用静态FileStoreHolder来提供文件存储。正如文档商店推荐的那样。

 internal class FilesStoreHolder
{
    private static readonly Lazy<IFilesStore> Store = new Lazy<IFilesStore>(CreateStore);
    public static IFilesStore FilesStore
    {
        get { return Store.Value; }
    }

    private static IFilesStore CreateStore()
    {
        var store = new FilesStore
        {
          ConnectionStringName = "ConnStr",
          DefaultFileSystem = "MyFS"
        }.Initialize();

        return store;
    }
}

然后当我需要FS会话时,我会这样做:

 using (var fsSession = FilesStoreHolder.FilesStore.OpenAsyncSession())
        {
            return await fsSession.DownloadAsync(Folder + name);
        }