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
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
Zena janaSvobodova = GetProxy(ctx, "Jana", "Svobodová").Cast
Oddat(ctx, janSvoboda, janaSvobodova);
//syn...
Muz jiriSvoboda = GetProxy(ctx, "Jiří", "Svoboda").Cast<Muz>
Zena veraTicha = GetProxy(ctx, "Věra", "Tichá").Cast
Oddat(ctx, jiriSvoboda, veraTicha, "Svobodová");
//syn...
Muz pavelSvoboda = GetProxy(ctx, "Pavel", "Svoboda").Cast<Muz>
Zena pavlaMala = GetProxy(ctx, "Pavla", "Malá").Cast
Oddat(ctx, pavelSvoboda, pavlaMala, "Svobodová");
//dcera...
Zena evaSvobodova = GetProxy(ctx, "Eva", "Svobodová").Cast<Zena>
Muz petrNovak = GetProxy(ctx, "Petr", "Novák").Cast
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>
foreach (Osoba osoba in osoby.Cast
{
Console.WriteLine(osoba.ToString());
Console.WriteLine(string.Format("\tPARTNER : {0}", partner));
}
Console.ReadLine();
}
{
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
muz.RemovePartner(zena);
ctx.Commit();
}
}
Partnerství je symetrický vztah, čili je jedno, ze které strany jej přidáváme nebo odebíráme.