Невозможно выполнить сохранение, поскольку документ был изменен сеансом и также участвует в отложенной команде PATCH RavenDB

2

Я пытаюсь выполнить команду исправления в Ravendb С# и получаю эту ошибку. Я собираюсь создать новую запись и попытаться сохранить ее.

Вот подходящие классы для обработки сериализации, десериализации json.

    public class Merchant
{
    [JsonProperty(PropertyName ="Id")]
    public string Id { get; set; }
    [JsonProperty(PropertyName = "name")]
    public string name { get; set; }
    [JsonProperty(PropertyName = "venues")]
    public System.Collections.Generic.List<Venue> venues { get; set; }
    [JsonProperty(PropertyName ="files")]
    public System.Collections.Generic.List<File> files { get; set; }
}

public class Venue
{
    [JsonProperty(PropertyName = "Id")]
    public string Id { get; set; }
    [JsonProperty(PropertyName = "name")]
    public string name { get; set; }
    [JsonProperty(PropertyName = "tills")]
    public List<Till> tills { get; set; }
    [JsonProperty(PropertyName = "files")]
    public System.Collections.Generic.List<File> files { get; set; }
}

public class Till
{
    [JsonProperty(PropertyName = "Id")]
    public string Id { get; set; }
    [JsonProperty(PropertyName = "name")]
    public string name { get; set; }
    [JsonProperty(PropertyName = "files")]
    public System.Collections.Generic.List<File> files { get; set; }
    [JsonProperty(PropertyName = "logs")]
    public List<Log> logs { get; set; }
}

//здесь функция, которая вызывается первой.

 public bool AddMerchant(Merchant m)
    {
        bool returnbool = false; // set to false at begining.
        if (DoesServiceExist("RavenDB"))
        {
            StartService("RavenDB");
            returnbool = true;

            using (IDocumentSession session = store.OpenSession())
            {
                session.Store(m);
                session.SaveChanges();
            }
        }
        return returnbool;
    }

здесь, где начинается моя проблема, я вызываю эту функцию, и она говорит мне, что я не могу выполнить это действие из-за того, что оно содержится в отложенном операторе исправления.

 public void AddVenue(string idArg, Venue venue = null)
    {
        using (IDocumentSession session = store.OpenSession())
        {

            var merchant = session.Load<Merchant>(idArg);
            List<Venue> venuesList = new List<Venue>();
            if (merchant.venues == null) { session.Advanced.Patch(merchant, m => m.venues, venuesList); }
            else
            {
                session.Advanced.Patch(merchant,
                x => x.venues,
                venues => venues.Add(venue));
            }
            session.SaveChanges();

        }
    }

После исследования я полагал, что Defer в ravendb ссылался на это:

session.advanced().defer(new PatchCommandData("blogposts/1", null, patchRequest, null));

Который я никогда не называю.

Любая помощь приветствуется.

//окончательный ответ ниже, спасибо.

    public void AddVenue(Merchant merchant, Venue venue = null)
    {
        using (IDocumentSession session = store.OpenSession())
        {
            Merchant merchantLocal = session.Load<Merchant>(merchant.Id);
            var changeVector = session.Advanced.GetChangeVectorFor(merchantLocal);
            if(merchantLocal.venues == null) { merchantLocal.venues = new List<Venue>(); }
            merchantLocal.venues.Add(venue);
            session.Store(merchantLocal, changeVector, merchantLocal.Id);
            session.SaveChanges();
        }
    }
Теги:
ravendb

1 ответ

4
Лучший ответ

Как говорится в сообщении об ошибке, свойство venues изменилось, поэтому во время ' SaveChanges ' операция исправления не может быть применена.

Прочитайте о исправлениях документов и одновременных изменениях в https://github.com/ravendb/book/blob/v4.0/Ch04/Ch04.md#patching-documents-and-concurrent-modifications

  1. Если вы знаете идентификатор документа, не используйте Load вообще.
    Просто позвоните в Patch и SaveChanges.

    ИЛИ ЖЕ

  2. Применить патч только при некоторых условиях

using (var session = store.OpenSession())
{
    var merchant = session.Load<Merchant>(idArg);

    if (merchant.venues  !=  SOME_CONDITION )
    throw new
        InvalidOperationException("venues have changed. Cannot apply patch Operation");

    List<Venue> venuesList = new List<Venue>();

    if (merchant.venues == null) { 
        session.Advanced.Patch(merchant, m => m.venues, venuesList); 
    }
    else {
        session.Advanced.Patch(merchant,
        x => x.venues,
        venues => venues.Add(venue));
    }

    session.SaveChanges();
}
  • 0
    Спасибо. Работаем над исправлением этого сейчас.
  • 0
    Спасибо, это работает. Добавление окончательного кода в исходное сообщение.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню