c# - 如何添加到 RavenDB 列表在.net
问题描述
更新:我通过将工作代码复制粘贴到一个新的干净项目中来修复它。我不知道为什么我会得到那个错误,但只要它消失了
我在弄清楚如何做我想做的事情时遇到了问题。在这种情况下,我拥有的是商家数据库,我希望能够将场所作为列表添加到数据库中的商家条目中。出于某种原因,我不知道为什么,我可以获取商家,但似乎无法获取我获取的条目的 id 然后更新它。(我在更新时也遇到了一些问题,据我所知,我需要我想要的条目的 ID,然后我可以用补丁更新......对吗?)
这是我的 Json 类:
public class Merchant
{
[JsonProperty(PropertyName = "name")]
public string name { get; set; }
[JsonProperty(PropertyName = "venues")]
public List<Venue> venues { get; set; }
}
public class Venue
{
[JsonProperty(PropertyName = "name")]
public string name { get; set; }
[JsonProperty(PropertyName = "tills")]
public List<Till> tills { get; set; }
}
public class Till
{
[JsonProperty(PropertyName = "name")]
public string name { get; set; }
}
这是我的 RavenDB 处理程序类的相关函数:
public List<JObject> QueryFromDb(string query)
{
List<Object> objReturned;
List<JObject> jObjects = new List<JObject>();
using (IDocumentSession session = store.OpenSession())
{
objReturned = session
.Advanced.RawQuery<Object>(query)
.ToList();
}
for (var i = 0; i < objReturned.Count; i++)
{
var json = JsonConvert.SerializeObject(objReturned[i], Formatting.Indented);
jObjects.Add(JObject.Parse( json.ToString()));
}
return jObjects;
}
public String GetJsonFromDB(string query)
{
string returnStr = "";
List<JObject> myResponse = QueryFromDb(query);
for (var i = 0; i < myResponse.Count; i++)
{
var json = JsonConvert.SerializeObject(myResponse[i], Formatting.Indented);
returnStr += json.ToString();
}
return returnStr;
}
这是我试图获取 ravendb 条目的 ID:
public void UpdateMerchantList()
{
merchantGrid.Rows.Clear();
List<JObject> myResponse = ravenDB.QueryFromDb("from Merchants");
for (var i = 0; i < myResponse.Count; i++)
{
var json = JsonConvert.SerializeObject(myResponse[i], Formatting.Indented);
Merchant merchant = new Merchant(json.ToString());
if (myResponse[i].Property("Id") != null) { merchant.MyID = myResponse[i].Property("Id").ToString(); }
merchantGrid.Rows.Add(merchant.MyID, merchant.name);
}
}
出于某种原因,我将这段代码移植到控制台应用程序中,并让它与这段代码一起工作:
List<JObject> result = ravenDb.QueryFromDb("from Merchants");
for(var i = 0; i < result.Count; i++)
{
Console.WriteLine(result[i].Property("Id").ToString());
}
这确实给了我想要的确切内容:“Id”:“merchants/97-A”“Id”:“merchants/98-A”“Id”:“merchants/129-A”“Id”:“merchants/ 130-A"
但是当我将它移植回我的表单并尝试将其添加到 datagridview 时,我再也看不到它了。
更新:已经能够将列表添加到控制台应用程序中的商家类中。这是代码。
public void AddVenue(string idArg,Venue venue)
{
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();
}
}
只是为了让人们理解我在说什么:这是从表单应用程序输出的 json:
为什么?
当在控制台中使用几乎相同的代码(复制粘贴)时,我得到了这个:
我从一个应用程序获得的数据比另一个应用程序多,我真的很想要这个 id。
我想我将把代码重构为一个 wcf 应用程序。只是因为。也许我会不小心修复它。
解决方案
您可以直接加载给定类的对象,无需自己处理 JSON(反)序列化,除非有特定原因。
此外,当您不想加载文档(以节省带宽)时,使用修补更有用。当您已经加载了文档时,您可以简单地更改它并保存更改。
请参阅以下代码以供参考:
public class Merchant
{
// note added Id property
public string Id { get; set; }
[JsonProperty(PropertyName = "name")]
public string name { get; set; }
[JsonProperty(PropertyName = "venues")]
public List<Venue> venues { get; set; }
}
public class Venue
{
[JsonProperty(PropertyName = "name")]
public string name { get; set; }
[JsonProperty(PropertyName = "tills")]
public List<Till> tills { get; set; }
}
public class Till
{
[JsonProperty(PropertyName = "name")]
public string name { get; set; }
}
public void MerchantsTest()
{
using (var store = GetDocumentStore())
{
using (var session = store.OpenSession())
{
session.Store(new Merchant { Id = "merchant-1", name = "merchant1", venues = new List<Venue> { new Venue { name = "venue-1A", tills = new List<Till> { new Till { name = "till-1A-first" } } } } });
session.Store(new Merchant { Id = "merchant-2", name = "merchant2", venues = new List<Venue> { new Venue { name = "venue-2A", tills = new List<Till> { new Till { name = "till-2A-first" } } } } });
session.SaveChanges();
}
using (var session = store.OpenSession())
{
// you can load all merchants
var merchants = session.Query<Merchant>(null, "Merchants").ToList();
// or load specific merchant by ID
var merchant2 = session.Load<Merchant>("merchant-1");
// add a venue to a loaded merchant (not using patch but simply adding the object)
merchant2.venues.Add(new Venue { name = "venue-2B", tills = new List<Till> { new Till { name = "till-2B-first" } } });
session.SaveChanges();
}
}
}
推荐阅读
- bash - 如果分支没有最新的 master,Azure 构建失败
- twig - Symfony 5 和 opache 的 Twig 缓存问题
- python - 请求的输出格式“s16le”不是 discord.py 中合适的输出格式
- java - 如何为每个控制器设置不同的基本 url
- plugins - 右键单击项目
- snowflake-cloud-data-platform - 雪花:通过插入值添加多个值时面临问题
- python - 使用获取的结果选择数据框中的列
- web-config - 每天在 web.config 中自动更改 connString
- scala - Scala - 使用数组的最后一个元素进行计算
- angular - 可通过硬编码数据观察