Persistentní třída Osoba

Persistentní třída Osoba dědí od třídy Proxy. Je to základní třída, uchovávající záznam o osobě. Od této třídy odvodíme třídy Muz a Zena.

using System;
using System.IO;
using AVRivet;

namespace Rodokmen
{
    public class Osoba : Proxy
    {
        public Osoba() { }

        [MaxLength(20)]
        public string Jmeno;
        [MaxLength(50)]
        public string Prijmeni;
        public DateTime? DatNarozeni;
        public Stream Portret;
        [ForeignKey(typeof(Muz))]
        public Proxy Otec;
        [ForeignKey(typeof(Zena))]
        public Proxy Matka;

        public virtual ProxyList GetDeti() { return ProxyList.Create(); }

        public ProxyList GetSourozenci()
        {
            return Matka.LightCast<Osoba>()
                .GetDeti()
                .Union(                                                
                    Otec.LightCast<Osoba>()
                     .GetDeti()
                    ).Subtract(this);
        }

        public virtual ProxyList GetPartneri() { return ProxyList.Create(); }

        public override string ToString()
        {
            return string.Format("{0} {1} {2}",
                    Jmeno,
                    Prijmeni,
                    DatNarozeni.HasValue ? DatNarozeni.Value.Year.ToString() : string.Empty
                ).Trim();
        }
    }
}

Poznámky ke kódu:

  • třída Proxy je předkem všech persistentních tříd a obsahuje primární klíč OID
  • vždy je požadován základní konstruktor
  • [MaxLength(20)] - zadání pro generátor DB skriptu - šířka sloupce v tabulce
  • DateTime? - lze použít nulovatelné typy
  • obrázek uložíme jako Stream
  • [ForeignKey(typeof(Muz))] - takto se definuje cizí klíč – Otec je typu Muz
  • public Proxy Otec - vazba 1xN je vždy typu Proxy
  • [ForeignKey(typeof(Zena))] - Matka je typu Zena
  • metoda GetDeti() bude přetížena v potomcích
  • Matka.LightCast() - metoda LightCast provádí „lehkou“ konverzi na cílový typ - načítá pouze vazby, nikoli všechny hodnoty
  • GetDeti() - vrátí seznam dětí
  • Union(...) - operace sjednocení seznamů
  • Subtract(this) - nejsme sami svým sourozencem :-)
  • ToString() - příklad, jak se definuje „zkratka“ objektu