user1005310
user1005310

Reputation: 877

Bulk delete using Ravendb

I am trying to delete documents ids from a collection in RavenDB using the below logic

    var documentstore = new DocumentStore
{
    Url = "http://localhost:8080",

    DefaultDatabase = "Employee"
};
documentstore.Initialize();
using (var session = documentstore.OpenSession())
{

    var test = new List<string>();

    test.Add("emps/81993");
    test.Add("emps/40319");

    var w1 = session.Load<Employee>(test);
    session.Delete(w1);
    session.SaveChanges();
}

I get the below error

Models.Employee[] is not associated with the session, cannot delete unknown

How do I go about doing a bulk delete of document Ids from the collection?

Thanks

Upvotes: 1

Views: 2232

Answers (2)

Michael
Michael

Reputation: 880

You can use set based operation. The following code will query specific index and delete everything matching the query

var operation = store.DatabaseCommands.DeleteByIndex("Index Name", new IndexQuery
            {
                Query = "Lucene query of stuff to delete"
            }, options: null);


for example, the following code will delete all documents from a document collection called "Companies" (excerpt from one of RavenDB unit tests)

var operation = documentStore.DatabaseCommands.DeleteByIndex("Raven/DocumentsByEntityName", new IndexQuery
            {
                Query = "Tag:[[Companies]]"
            });

You can read more in this link to RavenDB documentation

Upvotes: 1

Jens Pettersson
Jens Pettersson

Reputation: 1177

You are trying to delete the array of employees, not each employee itself. When you pass in an Enumerable in the Load, you will get an array back containing each entity.

Try this instead:

using (var session = documentstore.OpenSession())
{
    var test = new List<string>();

    test.Add("emps/81993");
    test.Add("emps/40319");

    Employee[] employees = session.Load<Employee>(test);
    foreach (var employee in employees)
    {
        session.Delete(employee);
    }

    session.SaveChanges();
}

To further explain, the returned array is not tracked by RavenDb's UoW, but each individual item in the array is, that's why you get the message about Employee[] is not associated with the session.

Upvotes: 2

Related Questions