Projektowanie obiektowe oprogramowania Wykład 9 Wzorce architektury aplikacji (1) Wiktor Zychla 2017

Podobne dokumenty
Projektowanie obiektowe oprogramowania Wykład 9 Wzorce architektury aplikacji (1) Wiktor Zychla 2014

Projektowanie obiektowe oprogramowania Wykład 9 Wzorce architektury aplikacji (1) Wiktor Zychla 2015

Projektowanie obiektowe oprogramowania Wykład 9 Wzorce architektury aplikacji (1) Wiktor Zychla 2013

ZADANIA ZAMKNIĘTE. A. o 25% B. o 50% C. o 44% D. o 56% A. B. C. 7 D..

Kryteria wyboru operacji. gospodarczej

Projektowanie obiektowe oprogramowania Wzorce architektury aplikacji (3) Wykład 11 Repository, Unit of Work Wiktor Zychla 2017

Zadanie T4 (numeryczne) Część I. uzasadnieniem.

Projektowanie obiektowe oprogramowania Wzorce architektury aplikacji (3) Wykład 11 Repository, Unit of Work Wiktor Zychla 2016

Informator Media Legia Warszawa

TEMAT: Koncepcja budowy Platformy Edukacyjnej Prosument z wykorzystaniem oprogramowania Pakiet dla Efektywności Energetycznej. Gliwice, 27 maja 2014

Instalacja Windows w trybie UEFI i optymalizacja dysku twardego

Zbigniew Finfando,

Długi tytuł preze ta ji. w dwóch wierszach. Wpływ EKPC a uwzględ ia ie wi y. jako przesła ki dopusz zal oś i. prawa antymonopolowego i energetycznego

Inna nacja. Najpierw trze a z ie ić w ogóle to że jesteś y tą a ją. Idzie y do pliku player.inc i szukamy fazy

ŁĄ

Zadanie D1. Teoria. Prędkość ag esu rur e ardzo sz ko się ustala, ię z prz liże ie artość prędkoś i ag esu

o d ro z m ia r u /p o w y ż e j 1 0 c m d ł c m śr e d n ic y 5 a ) o ś r e d n ic y 2,5 5 c m 5 b ) o śr e d n ic y 5 c m 1 0 c m 8

Informacja Kasy Krajowej. publikacji Komisji Nadzoru Finansowego z r. doty zą ej sektora SKOK

Wykorzystanie Systemu Informacji Geograficznej (GIS) do wspo aga ia zarządza ia utrzy a ie ru hu a przykładzie przedsię iorstw ra ży spożyw zej

E-learning w drodze, czyli jak. Ola Majchrzak

PROGRAM SPORTOWO-REKREACYJNY DLA PRACOWNIKÓW

Jak ędzie się kształtował zas wykorzystania mocy znamionowej poszczególnych klas bloków w Polsce do roku 0 0 i jakie ędą tego konsekwencje?

Co przeko ało szkoły, że Falo hro jest waż y?

NAWIER)CHNIE MOSTOWE Wprowadze ie w te atykę se i ariu. Wojciech Radomski.

Podejście obiektowe do relacyjnych baz danych Hibernate.

PROJEKT DOCELOWEJ ORGANIZACJI RUCHU DLA ZADANIA: PRZEBUDOWA UL PIASTÓW ŚLĄSKICH (OD UL. DZIERŻONIA DO UL. KOPALNIANEJ) W MYSŁOWICACH

JAK NIE OSIĄGAĆ CELÓW

Java Persistence API - zagadnienia zaawansowane

Tra spare t ość najbardziej potrzebna innowacja w ochronie zdrowia. Ewa )ygadło-kozaczuk Centrum Informacji o Leku

Hufce 2.3. Podanie do wiadomości wyników wyborów

Przygotowanie mapy do oskr ptowa ia i po zątek

Bazy danych dla producenta mebli tapicerowanych. Bartosz Janiak Marcin Sikora Wrocław r.

po upadku powstania styczniowego władze rosyjskie posta owiły zro ić z Polaków dobrych Rosjan;

Programowanie obiektowe

1 LINQ. Zaawansowane programowanie internetowe Instrukcja nr 1

Instrukcja obiegu i kontroli dokumentów powodujących skutki finansowo-gospodarcze w ZHP Spis treści

RPMP /17

Poznaj ASP.NET MVC. Kamil Cieślak Microsoft Student Partner

O bjaśn ien ia. do in form acji o przeb iegu w yk on an ia plan u finansow ego za I -sze półrocze 2018r.


MODELOWANIE ENERGETYCZNE PRAKTYCZNE ZASTOSOWANIE BIM W PROCESIE PROJEKTOWANIA ARCHITEKTURY WSPÓŁCZESNEJ CEA 2017 CZŁOWIEK EKOLOGIA ARCHITEKTURA

organizowane przez VITAL-MED Kuś ierz w Rzeszowie INSTRUKCJA ZŁOŻENIA WNIOSKU DLA PIELĘGNIAREK i POŁOŻNYCH

RADA NA DZIŚ. Kompletny zapis artykułu dostęp ego pod adrese :

Programowanie wielowarstwowe i komponentowe

LINQ TO XML. Autor ćwiczenia: Marcin Wolicki

Przewodnik po wydarzeniu

Metoda ada ia jakoś i oś ietle ia dużej li z przejść dla piesz h dr hab. inż. Piotr Tomczuk Politechnika Warszawska Wydział Transportu

Informacja dla przedsię ior y. Moduł opra owa y i realizowa y w ra a h i owa ji społe z ej: User-centric innovation hub.

ANEKS NR 1 DO PROSPEKTU EMISYJNEGO PODSTAWOWEGO IV PROGRAMU EMISJI OBLIGACJI KRUK SPÓŁKA AKCYJNA

Zarządze ie Nr OB Wójt G i y Turawa. z dnia 31 stycznia 2017r.

Mapowanie obiektowo-relacyjne z wykorzystaniem Hibernate

Nie tylko re o t proponowane modele wsparcia mieszkaniowego na obszarze rewitalizacji dr Barbara Audycka, Fundacja Habitat for Humanity Poland

ZAPROSZENIE DO ZŁOŻENIA OFERTY CENOWEJ NA WYKONANIE BUDYNKU PRODUKCYJNEGO Z CZĘŚCIĄ BIUROWĄ

Malowanki wiejskie. OB OKI / agodne ręce lata. œ œ œ # œ œ. œ œ œ # œœ œ œ. œ œ œ œ. j œ œ œ # œ œ œ. j œ. & œ # œ œ œ œ œœ. œ & œ i. œ i I. œ # œ.

REGULAMIN OGÓLNOPOLSKIEGO KONKURSU FOTOGRAFICZNEGO OD STRONY RZEKI, CZYLI WISŁA W OBIEKTYWIE EDYCJA ZIMOWO-WIOSENNA

Monitor Prawny Politechniki Śląskiej

Ę Ę ĘŚ Ą Ł Ę ł ł ś ą ź ż ź ą ż ć ąż ą ś ą

Programowanie obiektowe

Programowanie obiektowe i zdarzeniowe

Zawód: stolarz meblowy I. Etap teoretyczny (część pisemna i ustna) egzaminu obejmuje: Z ak res wi ad omoś c i i u mi ej ę tn oś c i wł aś c i wyc h d

Wrocław, dnia 27 marca 2015 r. Poz UCHWAŁA NR VIII/113/15 RADY MIEJSKIEJ WROCŁAWIA. z dnia 19 marca 2015 r.

Ę Ę ć ć Ę Ą ć ć

Blokowanie wielu miejsc przez jednego kandydata Brak rzetelnych danych pozwalających racjonalnie kształtować politykę sieci szkół

Ś Ó Ź Ś Ś

Monitor Prawny Politechniki Śląskiej

NHibernate. Narzędzie mapowania obiektowo - relacyjnego

, , , , 0

Wykład 4: Klasy i Metody

Zawód: monter instalacji i urządzeń sanitarnych I. Etap teoretyczny (część pisemna i ustna) egzaminu obejmuje: Z ak res w iadomoś ci i umieję tnoś ci

ą ą Ź Ą Ó Ó Ó ż ą Ź Ó Ę ą

Ś Ó Ą Ó Ó Ż ć Ó Ż Ó Ą Ź Ź Ó Ó Ó Ź Ó Ź Ó

31% 25% 22% 16% Wskaź ik siły wizeru ku liderów politycznych. Wykres preze tuje śred ie o e y da ego polityka. [odpowiadający: za ierzający głosować]

ZARZĄDZENIE NR 72/2019 WÓJTA GMINY CZERNIKOWO z dnia 29 sierpnia 2019 r.

Baza danych sql. 1. Wprowadzenie

ć ć Ł

Sil e i sła e stro y polskiej ate atyki. zyli potrze a ko solida ji i jed oś i środowiska


MVC w praktyce tworzymy system artykułów. cz. 1

Programowanie obiektowe

ó ę ą ż ż ś ść Ó Ś ż Ó Ś ę ą żć ó ż Ó ż Ó ó ó ż Ó ż ó ą ą Ą ś ą ż ó ó ż ę Ć ż ż ż Ó ó ó ó ę ż ę Ó ż ę ż Ó Ę Ó ó Óś Ś ść ę ć Ś ę ąć śó ą ę ęż ó ó ż Ś ż

Ł ó ó Ż ż ó Ń Ń Ł ó ż Ę ż

JAK ZMIENIĆ ŚWIAT CZĘŚĆ.

Ę ż ć ŁĄ

ŁĄ Ł

Ż Ś ś Ę Ż

Ż Ę Ę Ę Ę Ę Ź Ż

Post-relacyjne bazy danych

Wykład 12. Programowanie serwera MS SQL 2005 w C#

Ś Ó Ó Ś ż Ś Ó Ś ŚÓ Ó

Programowanie obiektowe i zdarzeniowe wykład 4 Kompozycja, kolekcje, wiązanie danych


PRZYWÓDZTWO. Jak z ie ić świat zęść.

Gdzie jest moja tabela?

LINQ TO SQL w dużym skrócie jest to zintegrowany język zapytao pozwalający na mapowanie relacyjnych baz danych na model obiektowy.

Enkapsulacja, dziedziczenie, polimorfizm

Kurs programowania. Wykład 2. Wojciech Macyna. 17 marca 2016

Db4o obiektowa baza danych wersja.net

Paweł Rajba

Z awó d: p o s a d z k a r z I. Etap teoretyczny ( część pisemna i ustna) egzamin obejmuje: Zakres wiadomości i umiejętności właściwych dla kwalifikac

ZAPYTANIE OFERTOWE NR 2/11/2013

Transkrypt:

Projektowanie obiektowe oprogramowania Wykład 9 Wzorce architektury aplikacji (1) Wiktor Zychla 2017 1 Automated code generation To bardziej technika wspomagająca niż wzorzec, ale wykorzystywana w praktyce bardzo często. Chodzi o generowanie kodu przez automat, ale w taki sposób, żeby kod który generuje kod nie był tylko i wyłącznie kodem imperatywnym, ale możliwie jak najbardziej deklaratywnym. Realizowane przez wiele narzędzi, np. Text Template Transformation Toolkit (T4). Przykład: szablon generowania kodu klasy. <#@ template debug="false" hostspecific="false" language="c#" #> <#@ assembly name="system.core" #> <#@ output extension=".cs" #> <# #> string ClassName = "Foo"; string[] FieldNames = "Bar", "Qux" ; public class <#= ClassName #> <# foreach ( var field in FieldNames ) #> public string <#= field #>; <# #> Wykonanie szablonu spowoduje wygenerowanie kodu: public class Foo public string Bar; public string Qux; Szablon może pozyskać dane w dowolny sposób z pliku, z bazy danych itd. To co należy zapamiętać to to, że generatory kodu powinny udostępniać strategię generowania jedno i dwustopniowego

(w przypadku T4: TextTemplatingFileGenerator vs TextTemplatingFilePreprocessor). W generowaniu jednostopniowym (bezpośrednim) efektem ewaluacji szablonu jest dokument wynikowy (jak wyżej). W generowaniu dwustopniowym efektem ewaluacji szablonu jest kod imperatywny, który trzeba skompilować i wykonać i dopiero wynikiem wykonania tego kodu jest docelowy dokument. Zaletą podejścia dwustopniowego jest możliwość automatyzacji scenariuszy automatycznego generowania (łączenia wielu szablonów, generowania tego samego szablonu wielokrotnie z różnymi parametrami). Zrefaktoryzujmy powyższy przykład. Krok 1. Określenie parametrów szablonu na zewnątrz, w definicji klasy częściowej: public partial class TextTemplate1 public string ClassName; public string[] FieldNames; Krok 2. Korekta szablonu w taki sposób żeby odwoływał się do pól-parametrów: <#@ template debug="false" hostspecific="false" language="c#" #> <#@ assembly name="system.core" #> <#@ output extension=".cs" #> public class <#= this.classname #> <# foreach ( var field in this.fieldnames ) #> public string <#= field #>; <# #> Krok 3. Zamiana strategii generowania szablonu na TextTemplatingFilePreprocessor. Efektem generacji będzie tym razem kod imperatywny klasy TextTemplate1, która będzie posiadać metodę TransformText, wykonującą proces ewaluacji szablonu. Krok 4. Automatyzacja szablonu: static void Main( string[] args ) TextTemplate1 tpl = new TextTemplate1(); tpl.classname = "Foo"; tpl.fieldnames = new [] "Bar", "Qux" ; Console.WriteLine( tpl.transformtext() ); Console.ReadLine(); Taki dwustopniowy model ewaluacji jest ogólniejszy automatyzacja szablonu może odbywać się w kontekście złożonego procesu przetwarzania danych wejściowych i generowania wielu szablonów na podstawie jednego zbioru danych.

2 Object-relational mapping Uwaga! Ilustra je po hodzą z podrę z ika Patter s of E terprise Appli atio Ar hite ture. Wzorzec mapowania obiektowo-rela j ego jest jed z ożli h podejść do pro le u iezgod oś i ś iata o iekto ego i ś iata rela j ego rela j h az da h. Wzorze ORM jest i teresują ko tekś ie pod zor ó. 2.1 Database first vs Model first vs Code first Róż e strategie defi io a ia etada h ogą przełoż ć się a róż ą filozofię logist ki or : 1. Database first ajpier odelo a a jest struktura rela j a, a odel o iekto ją odwzorowuje (często jest ge ero a przez auto at; patrz Automated code generation) 2. Model first najpierw modelowana jest abstrakcyjna struktura modelu mapowania bazy da h a kod klas. Z odelu apo a ia ika zaró o struktura az da h jak i kodu klas. 3. Code first ajpier odelo a a jest struktura o iekto a, a struktura rela j a t lko ją od zoro uje zęsto jest ge ero a a i zarządza a przez auto at; prz kład z kładu E tit Framework Code First + Migrations) 2.2 Metadata mapping Silnik mapowania obiektowo-relacyj ego po i ie udostęp iać róż e strategie definiowania etada h, z li i for a ji a te at sz zegółó i ple e ta j h utr ala ia ele e tó odelu o iekto ego strukturze rela j ej.i. az ta el, kolu, t p kolu, długoś i kolu literalnych, oz a ze ia o do agal oś i, sposo u kodo a ia itd. wszystko to co nie wynika wprost z modelu obiektowego). 1. Metada e są zęś ią defi i ji klas atr ut, określo a hierar ha dziedzi ze ia 2. Metada e są ze ętrz e stosu ku do defi i ji klas (definiowane deklaratywnie w XML lub i perat ie za po o ą API Niektóre te h ologie apo a ia o iekto o rela j ego dostar zają dodatko ego e ha iz u zarządza ia tz. migracjami czyli wersjonowaniem modelu relacyjnego. 2.3 Navigation properties (aka Foreign key mapping) Mapowa ie klu zy o y h a rela je iędzy klasa i.

To ardzo atural e o zeki a ie. W odelu z diagra u po żej o zeki ali ś łaś i oś i nawigacyjnych (navigation properties) w obie strony klasa Album po i a ieć łaś i ość t pu Artist, a klasa Artist łaś i ość t pu IEnumerable<Album>. 2.4 Lazy loading O iekt ie zawiera da y h rela yj y h, ale wie jak je pozyskać. Laz loadi g dot z z kle pro esu łado a ia za artoś i łaś i oś i a iga j h. Jeżeli klasa Artist z poprzedniego diagra u za iera łaś i ość t pu IEnumerable<Album>, to inicjowanie tej łaś i oś i pod zas aterializa ji o iektu t pu Artist ogło ć ieefekt e. W star z o razić so ie zap ta ie SELECT * FROM ARTISTS WHERE ID = 1 którego i te ją jest z aterializowanie obiektu typu Artist o ide t fikatorze, t le że dodatko o aterializuje o o za artość łaś i oś i Albums i tak się iefortu ie składa, że pe ie art sta dał już iele set al u ó, a z kolei każd al u a łaś i ość a iga j ą skazują ą a w da ę, da a a siedzi ę, siedzi a a adres itd. Gorli e aterializo a ie takiego drze a o iektó połą zo h przez łaś i oś i a iga j e ie t lko ło ieefekt e z kle też ie a rę z potrze aterializo a ia go, o kod żądają materializa ji po zątko ego o iektu Artist ogóle ógł a et ie od z t ać artoś i żad ej z łaś i oś i a iga j h. W prakt e Laz loadi g realizo a jest a jede z trze h sposo ó : 1. Lazy initialization le i e łaś i oś i proper je za ierają or al, imperatywny kod dostępu do da h i flagę oole o ską, która działa jak straż ik, dzięki które u kod dostępu do da h ko uje się t lko za pier sz raze 2. Virtual proxy silnik mapowania obiektowo relacyjnego automatycznie tworzy wirtualne proxy do zwraca h o iektó, które to pro ają auto at z ie dołą zo kod i ple e tują Laz i itializatio róż i a jest taka, że ie trze a tego kodu i ple e to ać ezpośred io klasie dziedzi o ej 3. Value holder i ple e ta ja le i h składo h deleguje poz ski a ie artoś i do ze ętrz h o iektó, które zarządzają dostępe do da h W prakt e sz stkie trz etod są korz st a e zęsto, z prze agą. i. 2.5 One-to-one Pozwól wy rać odel dla rela ji jede -do-jede iędzy ta ela i Model rela j któr stępuje apo a ie jede -do-jeden realizowany jest zwyczajowo w taki sposó, że jed a z ta el adrzęd a a kolu ę ID oz a zo ą jako klu z głó, a druga z ta el podrzęd a kolu ę ID oz a zo ą jako klu z głó i ró o ześ ie klu z o do pier szej tabeli.

W te sposó po iąza e ze so ą rekord ają tę samą artość klu za ID. Silnik mapowania obiektowo-rela j ego po i ie poz alać a d a sposo za odelo a ia takiej struktury relacyjnej po stronie modelu obiektowego: Jedna klasa mapowana na dwie tabele (aka split entity) z punktu widzenia modelu o iekto ego a jed ą klasę, fiz z ie od zoro a ą d ó h ta ela h D ie oso e klas, połą zo e rela ją i pra dopodo ie łaś i oś ia i a iga j i obie strony relacji) 2.6 Many-to-many (aka Association table mapping) Automatycznie modeluj aso ja ję rela ję wiele-do-wiele iędzy o iekta i jako po o i zą ta elę W pra idło ej i ple e ta ji tego pod zor a aż e jest to, że sil ik ógł sa odziel ie zarządzać ta elą od zoro ują ą rela ję. W prakt e spot ka się zęsto i ple e ta je iepeł e za po o ą pod zor a Na igatio odelo a e są ja ie rela je iędz o ie a klasa i a ist ieją ą ja ie klasą- odele dla ta eli od zoro ują ej rela ję. 2.7 Concrete table/single table/class table Inheritance Trz ożli e strategie od zoro a ia dziedziczenia w strukturze relacyjnej.

1. Concrete table (aka Table per Concrete Type, TPC) W t podejś iu hierar hia apuje się a oso e ta ele dla każdej z konkretnych klas. Struktura rela j a ie jest ś iado a rela ji dziedziczenia w modelu obiektowym. Plusy: Minusy: to ajprostsze ożli e podejś ie do apo a ia dziedzi ze ia pro le at z e zarządza ie ide t z oś ia i te h i z ie aza da h sta i do róż h prze ież ta el o iekt o t sa ide t fikatorze a prze ież odeluje jed ą i tę sa ą hierar hię o iektó, ię ide t fikator po i ć róż e! pro le at z e apo a ie rela ji do ze ętrz h klas rela je usiał dot z ć każdej z ta el z oso a! utrud io e zarządza ie strukturą rela j ą zapytania o o iekt ają z ko ie z oś i zęsto postać UNION 2. Single table (aka Table per Hierarchy, TPH)

W t podejś iu hierar hia apuje się a jed ą ta elę za ierają ą su ę kolu z ałej hierar hii oraz dodatko ą kolu ę dyskryminatora, która określa rze z isty typ obiektu reprezentowanego przez wiersze tabeli. Plusy: Jed a ta ela a hierar hię oz a za, że zap ta ia są ko a e efekt ie Minusy: Wsz stkie te kolu z klas poto h, które ie stępują t pie azo, uszą zez alać strukturze rela j ej a prze ho a ie artoś i NULL Ła ie trze ią postać or al ą kolu a d skr i atora deter i uje fu k jo al ie artoś i dodatko h kolu, ale ie jest o a ró o ześ ie zęś ią klu za głó ego 3. Class table (aka Table per Type, TPT) Wię ej: W t podejś iu hierar hia apuje się a ta ele, ale każda z ta el od zoro uje t lko te kolu, które są łaś i e dla klas, którą odeluje. Dodatko o, każda z ta el od zoro ują h klas poto e za iera skaza ie klu z o do ta eli od zoro ują ej klasę azo ą. Plusy: Minusy: Struktura relacyjne jest poprawnie znormalizowana Zarządza ie od zoro a ie hiera hii t pó a strukturę rela j ą jest o z iste zap ta ia do sko pliko a h hiera hii są złożo e i zęsto ieefekt e ko ie z ość ge ero a ia złą zeń t pu INNER JOIN) http://weblogs.asp.net/manavi/archive/2010/12/24/inheritance-mapping-strategies-with-entityframework-code-first-ctp5-part-1-table-per-hierarchy-tph.aspx http://weblogs.asp.net/manavi/archive/2010/12/28/inheritance-mapping-strategies-with-entityframework-code-first-ctp5-part-2-table-per-type-tpt.aspx

http://weblogs.asp.net/manavi/archive/2011/01/03/inheritance-mapping-strategies-with-entityframework-code-first-ctp5-part-3-table-per-concrete-type-tpc-and-choosing-strategy-guidelines.aspx 2.8 1st level cache (aka Identity map) 1st level cache - zap ta ia o o iekt o ko kret h ide t fikatora h po i ć a he o a e. Ide tit ap to jed a z te h ik i ple e ta ji, której e ętrz ie korz stuje się kolek ję asocjac j ą, apują ą artość ide t fikatora a o iekt. 2.9 2nd level cache 2nd level cache ra e zap ta ia po i ć ożli e do a he o a ia. Po i ie ist ieć ja e ha iz do zarządza ia a he. I ple e ta ja pods ste u a he o a ia po i a ć ie a. 2.10 Query language Sil ik po i ie udostęp iać o iekto jęz k zada a ia zap tań, inny iż SQL. Do r prz kłade jęz ka zap tań jest Linq, i e prz kład to HQL, Criteria API, JPQL. 2.11 Global filter Quer la guage po i ie da ać ożli ość określe ia glo al ego filtra taki sposó że ł ko sek e t ie auto at z ie apliko a do sz stki h pozio ó zag ieżdżo h zap tań. 2.12 Soft Delete (logical delete) Filozofia od zoro a ia da h azie da h, której igd ie usu a się fiz z ie rekordó, a zamiast tego z akuje się je jako usu ięte kolu ie dodatkowego dyskryminatora. W aga spar ia jęz ku zap tań Quer la guage, które aj zęś iej realizuje się jako glo al filtr Glo al filter. Dodatko o, aga spar ia arst ie apo a ia ko a ie usu ię ia po i o zostać od zoro a e strukturze rela j ej jako oz ako a ie. Zalety: Wady: Często z ako a ie UPDATE jest sz sze iż usu a ie DELETE Ist ieje ożli ość aud tu t prz ró e ia! usu ięt h da h Dodatko a kolu a d skr i atora usi ć u zględ ia a zap ta ia h SELECT 3 Przykład dla Entity Framework 6.1 3.1 Klasy modeli public class ManyToManyLeft public ManyToManyLeft() this.rights = new List<ManyToManyRight>(); public int ID get; set; public string TheLeftProperty get; set;

public ICollection<ManyToManyRight> Rights get; set; public class ManyToManyRight public ManyToManyRight() this.lefts = new List<ManyToManyLeft>(); public int ID get; set; public string TheRightProperty get; set; public ICollection<ManyToManyLeft> Lefts get; set; public class OneToOneChild public int ID get; set; public string ChildName get; set; public virtual OneToOneParent Parent get; set; public class OneToOneParent public int ID get; set; public string ParentName get; set; public virtual OneToOneChild Child get; set; public class SplitEntity public int ID get; set; public string Property1 get; set; public string Property2 get; set; public abstract class TPHBase public int ID get; set; public string CommonProperty get; set; public class TPHChild1 : TPHBase public string Child1Property get; set;

public class TPHChild2 : TPHBase public int? Child2Property get; set; public abstract class TPTBase public int ID get; set; public string CommonProperty get; set; public class TPTChild1 : TPTBase public string Child1Property get; set; public class TPTChild2 : TPTBase public int? Child2Property get; set; 3.2 Klasa kontekstu public class ExampleContext : DbContext // table-per-hierarhy public IDbSet<TPHBase> TPH get; set; // table-per-type public IDbSet<TPTBase> TPT get; set; // one to one public IDbSet<OneToOneParent> OneToOneParent get; set; public IDbSet<OneToOneChild> OneToOneChild get; set; // split entity public IDbSet<SplitEntity> SplitEntity get; set; // many to many public IDbSet<ManyToManyLeft> Lefts get; set; public IDbSet<ManyToManyRight> Rights get; set; protected override void OnModelCreating( DbModelBuilder modelbuilder ) // tph // domyślnie - nic nie trzeba konfigurować ; // zmiana dyskryminatora modelbuilder.entity<tphbase>().totable( "TPHBase" ).Map<TPHChild1>( m => m.requires( "Dyskryminator" ).HasValue( "c1" ) ).Map<TPHChild2>( m => m.requires( "Dyskryminator" ).HasValue( "c2" ) ) // tpt modelbuilder.entity<tptbase>().totable( "TPTBase" ); modelbuilder.entity<tptchild1>().totable( "TPTChild1" );

modelbuilder.entity<tptchild2>().totable( "TPTChild2" ); // one-to-one modelbuilder.entity<onetoonechild>().hasrequired( e => e.parent ).WithOptional( e => e.child ); // entity split modelbuilder.entity<splitentity>().map( m => m.properties( p => new p.id, p.property1 ); m.totable( "SplitEntity" ); ).Map( m => m.properties( p => new p.property2 ); m.totable( "SplitEntityDetails" ); ); // many to many modelbuilder.entity<manytomanyleft>().hasmany<manytomanyright>( s => s.rights ).WithMany( c => c.lefts ).Map( cs => cs.mapleftkey( "LeftId" ); cs.maprightkey( "RightId" ); cs.totable( "ManyToManyLeftRight" ); ); base.onmodelcreating( modelbuilder ); // tpc - nie pokazujemy przykładu, bo trzebaby ręcznie zarządzać identycznościami 3.3 Orkiestracja class Program static void Main( string[] args ) Console.WriteLine( "starting" );

Database.SetInitializer<ExampleContext>( new DropCreateDatabaseIfModelChan ges<examplecontext>() ); // tph Console.WriteLine( "tph" ); using ( var ctx = new ExampleContext() ) var c1 = new TPHChild1(); c1.child1property = "child1property"; c1.commonproperty = "commonproperty1"; ctx.tph.add( c1 ); var c2 = new TPHChild2(); c2.child2property = 5; c2.commonproperty = "commonproperty2"; ctx.tph.add( c2 ); ctx.savechanges(); foreach ( var c in ctx.tph ) Console.WriteLine( c.gettype() ); // tpt Console.WriteLine( "tpt" ); using ( var ctx = new ExampleContext() ) var c1 = new TPTChild1(); c1.child1property = "child1property"; c1.commonproperty = "commonproperty1"; ctx.tpt.add( c1 ); var c2 = new TPTChild2(); c2.child2property = 5; c2.commonproperty = "commonproperty2"; ctx.tpt.add( c2 ); ctx.savechanges(); foreach ( var c in ctx.tpt ) Console.WriteLine( c.gettype() ); // one to zero-or-one Console.WriteLine( "one to zero-or-one" ); using ( var ctx = new ExampleContext() ) var p1 = new OneToOneParent(); p1.parentname = "parent1" + DateTime.Now; ctx.onetooneparent.add( p1 );

var p2 = new OneToOneParent(); p2.parentname = "parent2" + DateTime.Now; var c2 = new OneToOneChild(); c2.childname = "child2" + DateTime.Now; c2.parent = p2; ctx.onetoonechild.add( c2 ); ctx.savechanges(); foreach ( var p in ctx.onetooneparent.tolist() ) Console.WriteLine( "0-1", p.parentname, p.child!= null? p.child.childname : "[brak]" ); // split entity Console.WriteLine( "split entity" ); using ( var ctx = new ExampleContext() ) SplitEntity entity = new SplitEntity(); entity.property1 = "foo1" + DateTime.Now; entity.property2 = "foo2" + DateTime.Now; ctx.splitentity.add( entity ); ctx.savechanges(); foreach ( var e in ctx.splitentity ) Console.WriteLine( "0 1", e.property1, e.property2 ); // many to many Console.WriteLine( "many to many" ); using (var ctx = new ExampleContext()) ManyToManyLeft l1 = new ManyToManyLeft() TheLeftProperty = "l1" + DateTime.Now ; ManyToManyRight r1 = new ManyToManyRight() TheRightProperty = "r1" + DateTime.Now ; ManyToManyRight r2 = new ManyToManyRight() TheRightProperty = "r2" + DateTime.Now ; l1.rights.add( r1 ); l1.rights.add( r2 ); ctx.lefts.add( l1 ); ctx.savechanges(); l1 = ctx.lefts.firstordefault( l => l.id == l1.id ); foreach ( var right in l1.rights ) Console.WriteLine( "0", right.therightproperty );

Console.WriteLine( "finished" ); Console.ReadLine();