如何添加到列表RavenDB 在.NET

问题描述 投票:4回答:1

更新:我固定它通过复制粘贴工作的代码放到一个新的清洁项目。我不知道为什么我得到的是错误,但只要它不见了

我在盘算究竟怎么做我想做的问题。在这种情况下,我有什么是商人的分贝,我希望能够加入场馆列表数据库中的商家进入。出于某种原因,我想不通为什么,我可以获取商家,但似乎无法得到我所取,然后更新它的条目的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应用程序,我猜。只是因为。也许我会小心修复它这样做。

c# .net ravendb
1个回答
2
投票

您可以直接加载指定类的对象,无需处理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();
        }
    }
}
© www.soinside.com 2019 - 2024. All rights reserved.