Práce s vazbami NxN (vytvoření, zobrazení a rušení partnerství)

Nejprve přidáme osoby, které mají být partnery dětí z našeho příkladu, tedy dvě ženy a jednoho muže. Pro tento účel vytvoříme metodu „PridatPartnery“.

    private static void PridatPartnery()
    {
        Muz petrNovak =
            new Muz() { Jmeno = "Petr", Prijmeni = "Novák",
            DatNarozeni = new DateTime(1974, 4, 21) };
        Zena veraTicha =
            new Zena() { Jmeno = "Věra", Prijmeni = "Tichá",
            DatNarozeni = new DateTime(1977, 3, 3) };
        Zena pavlaMala =
            new Zena() { Jmeno = "Pavla", Prijmeni = "Malá",
            DatNarozeni = new DateTime(1976, 9, 5) };

        using (ContextTran ctx = Rivet.Instance.GetContextTran())
        {
            petrNovak.Bind(ctx).Update();
            veraTicha.Bind(ctx).Update();
            pavlaMala.Bind(ctx).Update();

            ctx.Commit();
        }
    }

Z metody Zobrazit pro přehlednost opět odstraníme cyklus pro zobrazování dětí a necháme pouze základní smyčku:

        foreach (Osoba osoba in osoby.Cast<Osoba>())
            Console.WriteLine(osoba.ToString());

V hlavním programu pak zavoláme takovouto posloupnost:

    static void Main(string[] args)
    {
        Init();

        PridatPartnery ();
        Zobrazit ();
    }

A dostaneme:

Nyní budeme potřebovat metodu pro načtení osoby, třeba podle zadaného jména. Nazvěme jí „GetProxy“:

  • argument metody Query můžeme psát obdobně jako u metody string.Format(...)

        private static Proxy GetProxy(Context ctx, string jmeno, string prijmeni)
        {
            ProxyList list = ctx.GetProxyList()
                .Query("select OID from Osoba where Jmeno='{0}' and Prijmeni='{1}'", jmeno, prijmeni);
            return list.Count > 0 ? list[0] : null;
        }

Partnerství vytvoříme v metodě „Oddej“. Zde nastavíme ženě nové příjmení (pokud při volání zadáme nepovinný parametr „novePrijmeni“) a přiřadíme jí partnera metodou „AddPartner“:

        private static void Oddej(Muz muz, Zena zena, string novePrijmeni = “”)
        {
            if (novePrijmeni != “”)
                zena.Prijmeni = novePrijmeni;
            zena.AddPartner(muz);
            zena.Update();
        }

V následující metodě „OddatVsechny“ potom vytvoříme jak partnerství rodičů, tak i partnerství jejich tří dětí s nově přidanými osobami:

        private static void OddatVsechny()
        {
            using (ContextTran ctx = Rivet.Instance.GetContextTran())
            {
                //rodiče...
                Muz janSvoboda = GetProxy(ctx, "Jan", "Svoboda").Cast<Muz>();
                Zena janaSvobodova = GetProxy(ctx, "Jana", "Svobodová").Cast<Zena>();
                Oddat(ctx, janSvoboda, janaSvobodova);

                //syn...
                Muz jiriSvoboda = GetProxy(ctx, "Jiří", "Svoboda").Cast<Muz>();
                Zena veraTicha = GetProxy(ctx, "Věra", "Tichá").Cast<Zena>();
                Oddat(ctx, jiriSvoboda, veraTicha, "Svobodová");

                //syn...
                Muz pavelSvoboda = GetProxy(ctx, "Pavel", "Svoboda").Cast<Muz>();
                Zena pavlaMala = GetProxy(ctx, "Pavla", "Malá").Cast<Zena>();
                Oddat(ctx, pavelSvoboda, pavlaMala, "Svobodová");

                //dcera...
                Zena evaSvobodova = GetProxy(ctx, "Eva", "Svobodová").Cast<Zena>();
                Muz petrNovak = GetProxy(ctx, "Petr", "Novák").Cast<Muz>();
                Oddat(ctx, petrNovak, evaSvobodova, "Nováková");

                ctx.Commit();
            }
        }


Ještě upravíme metodu Zobrazit tak, aby nám ke každé osobě vypsala všechny partnery:

        private static void Zobrazit()
        {
            ProxyList osoby = Rivet.Instance
                .Query("select OID from Osoba")
                .Sort<Osoba>(SortDirection.Asc, a => a.DatNarozeni);

            foreach (Osoba osoba in osoby.Cast<Osoba>())
            {
                Console.WriteLine(osoba.ToString());             

                foreach (Osoba partner in osoba.GetPartneri().Cast<Osoba>())
                    Console.WriteLine(string.Format("\tPARTNER : {0}", partner));
            }

            Console.ReadLine();
        }

V hlavním programu pak zavoláme tuto posloupnost:

        static void Main(string[] args)
        {
            Init();

            OddatVsechny ();
            Zobrazit ();
        }

A dostaneme:

Pokud bychom chtěli partnerství smazat, mohli bychom použít metodu RozvestVsechny:

        private static void RozvestVsechny()
        {
            using (ContextTran ctx = Rivet.Instance.GetContextTran())
            {
                ProxyList muzi = ctx.GetProxyList()
                    .Query("select OID from Muz");

                foreach (Muz muz in muzi.Cast<Muz>())
                    foreach (Zena zena in muz.GetPartneri().Cast<Zena>())
                        muz.RemovePartner(zena);

                ctx.Commit();
            }
        }

Pozn.:
Partnerství je symetrický vztah, čili je jedno, ze které strany jej přidáváme nebo odebíráme.