从RavenDB数据库中清除所有附件的最简单方法是什么?
我正在使用.NET API,但我愿意接受原始HTTP调用。
答案 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; }
}