首页 > 解决方案 > 如何添加到 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

为什么?

当在控制台中使用几乎相同的代码(复制粘贴)时,我得到了这个: 看看这看起来好多了?

我从一个应用程序获得的数据比另一个应用程序多,我真的很想要这个 id。

我想我将把代码重构为一个 wcf 应用程序。只是因为。也许我会不小心修复它。

标签: c#.netravendb

解决方案


您可以直接加载给定类的对象,无需自己处理 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();
        }
    }
}

推荐阅读