删除所有附件

时间:2013-11-15 14:10:47

标签: .net ravendb

从RavenDB数据库中清除所有附件的最简单方法是什么?

我正在使用.NET API,但我愿意接受原始HTTP调用。

2 个答案:

答案 0 :(得分:3)

这将遍历数据库中的所有附件,并一次删除一个附件。

private void DeleteAllAttachments(IDocumentStore store)
{
    while (true)
    {
        var header = store.DatabaseCommands
            .GetAttachmentHeadersStartingWith("", 0, 1)
            .FirstOrDefault();
        if (header == null) return;
        store.DatabaseCommands.DeleteAttachment(header.Key, null);
    }
}

你可以通过采用更大的页面大小来优化它,但是因为你无论如何都要删除它,它可能没那么重要。

答案 1 :(得分:1)

据我所知,没有内置选项来获取数据库的所有附件。但是你可以做到以下几点:

var client = new HttpClient();
client.BaseAddress = new Uri("http://localhost:8080");
client.DefaultRequestHeaders.Accept.Add(new MediaTypeWithQualityHeaderValue("*/*"));
HttpResponseMessage response = client.GetAsync("databases/YourDatabaseName/static").Result;
response.EnsureSuccessStatusCode();
var files = response.Content.ReadAsAsync<IList<AttachmentInformation>>().Result;

foreach (var fileDetail in files)
{
    store.DatabaseCommands.DeleteAttachment(fileDetail.Key, null);
}

为此,您需要以下POCO。并参考了Microsoft.AspNet.WebApi.Client v5。如果您只是执行ReadAsString并自己解析响应内容或使用其他json解析器,则可以删除此要求。

public class AttachmentInformation
{
    /// <summary>
    ///     Gets or sets the size.
    /// </summary>
    /// <value>The size.</value>
    public int Size { get; set; }

    /// <summary>
    ///     Gets or sets the key.
    /// </summary>
    /// <value>The key.</value>
    public string Key { get; set; }

    /// <summary>
    ///     Gets or sets the metadata.
    /// </summary>
    /// <value>The metadata.</value>
    public object Metadata { get; set; }

    /// <summary>
    ///     Gets or sets the etag.
    /// </summary>
    /// <value>The etag.</value>
    public Guid Etag { get; set; }
}