ICode9

精准搜索请尝试: 精确搜索
首页 > 编程语言> 文章详细

c# – 如何添加到.net中的RavenDB列表

2019-07-01 09:55:57  阅读:154  来源: 互联网

标签:c net ravendb


更新:我通过将工作代码粘贴到一个新的干净项目中来修复它.我不知道为什么我会得到那个bug,但只要它消失了

我在确定如何做我想做的事时遇到了问题.
在这种情况下,我拥有的商家数据库,我希望能够将场地作为列表添加到数据库中的商家条目.出于某种原因,我无法弄清楚为什么,我可以获取商家,但似乎无法获得我已获取的条目的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 Handler类的相关函数:

 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”:“商人/ 97-A”
“Id”:“商人/ 98-A”
“Id”:“商人/ 129-A”
“Id”:“商人/ 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:
No metadata, no id

为什么?

当在控制台中使用几乎相同的代码(复制粘贴)时,我得到了这个:
See how much better this looks?

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

我想将代码重构为wcf应用程序.只是因为.也许我会意外地修复它.

解决方法:

您可以直接加载给定类的对象,不需要自己处理JSON(de)序列化,除非有特定的理由这样做.

此外,当您不想加载文档(以节省带宽)时,使用修补更有用.加载文档后,只需更改文档并保存更改即可.

请参阅以下代码以供参考:

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();
        }
    }
}

标签:c,net,ravendb
来源: https://codeday.me/bug/20190701/1345627.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有