Как добавить в список RavenDB <type>в .net - PullRequest
0 голосов
/ 07 февраля 2019

Обновление: я исправил это, скопировав рабочий код в новый чистый проект.Я понятия не имею, почему я получил эту ошибку, но пока она исчезла

У меня проблемы с определением, как именно делать то, что я хочу.В этом случае у меня есть база данных торговцев, и я хочу иметь возможность добавлять места в качестве списка к записи продавца в базе данных.По какой-то причине я не могу понять, почему, я могу получить торговца, но, кажется, не могу получить идентификатор записи, которую я выбрал, и затем обновить ее.(У меня также есть некоторые проблемы с обновлением, из того, что я видел, мне нужен идентификатор записи, которую я хочу, и затем я могу обновить с патчем ... верно?)

Вотмой класс 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;
    }

А вот я пытаюсь получить Id записи ravendb:

 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"

Но когда я перевожу его обратно в форму и пытаюсь добавить его в таблицу данных, я больше не вижу его.

update: мне удалось добавить в список класс продавца в консольном приложении.Вот код.

 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?

Я получаю больше данных из одного приложения, чемдругой, и я действительно очень хочу идентификатор.

Я собираюсь реорганизовать код в приложение wcf, я думаю.Просто так.Может быть, я случайно исправлю это.

1 Ответ

0 голосов
/ 08 февраля 2019

Вы можете напрямую загрузить объект данного класса, не нужно самостоятельно обрабатывать сериализацию 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();
        }
    }
}
...