无法执行保存,因为文档已被会话修改并且还参与了延迟的 PATCH 命令 RavenDB
Cannot perform save because document has been modified by the session and is also taking part in deferred PATCH command RavenDB
我正在尝试在 Ravendb c# 中执行补丁命令,但收到此错误。我要做的是创建一个新条目然后尝试保存它。
这是处理 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();
}
}
经过研究我认为ravendb中的Defer指的是这个:
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();
}
}
如错误所述,地点 属性 已更改,因此在“SaveChanges
”时无法应用补丁操作。
阅读有关修补文档和并发修改的信息
https://github.com/ravendb/book/blob/v4.0/Ch04/Ch04.md#patching-documents-and-concurrent-modifications
如果您知道文档 ID,则根本不要使用 Load。
只需调用 Patch
和 SaveChanges
.
或
仅在某些情况下应用补丁
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();
}
我正在尝试在 Ravendb c# 中执行补丁命令,但收到此错误。我要做的是创建一个新条目然后尝试保存它。
这是处理 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();
}
}
经过研究我认为ravendb中的Defer指的是这个:
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();
}
}
如错误所述,地点 属性 已更改,因此在“SaveChanges
”时无法应用补丁操作。
阅读有关修补文档和并发修改的信息 https://github.com/ravendb/book/blob/v4.0/Ch04/Ch04.md#patching-documents-and-concurrent-modifications
如果您知道文档 ID,则根本不要使用 Load。
只需调用Patch
和SaveChanges
.或
仅在某些情况下应用补丁
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();
}