2010-04-20 12 views
29

Jaka jest korzyść z używania POCO? Nie rozumiem znaczenia Niewiedzy na temat Persistence, co to znaczy? Że obiekt poco nie może ujawnić rzeczy takich jak Save? Nie mogę owinąć głowy tym POCO, że jest tam dużo szumu.co to jest Entity Framework z POCO

Jaka jest różnica między jednostkami generowanymi przez EF a POCO?

Odpowiedz

42

POCO oznacza "Zwykły stary obiekt C#" lub "Zwykły stary obiekt CLR", w zależności od tego, o kogo pytasz. Jeśli framework lub API stwierdza, że ​​działa na POCO, oznacza to, że pozwala zdefiniować model obiektu idiomatically bez konieczności tworzenia obiektów z konkretnych klas bazowych. Ogólnie rzecz biorąc, struktury działające na POCO pozwalają na większą swobodę i kontrolę nad projektowaniem i wdrażaniem twoich zajęć, ponieważ mają mniej wymagań, aby działać poprawnie.

Niewiedza perswazji oznacza, że ​​w jak największym stopniu wszystko w kodzie operującym na poziomie logiki biznesowej lub wyższym nie wie nic o rzeczywistym projekcie bazy danych, jakim silniku bazy danych pracujesz ani jak i kiedy obiekty otrzymują pobrane z bazy lub utrwalone do bazy danych. W przypadku MEF ignorancja utrwalania jest uzyskiwana przez pracę nad POCO i używanie LINQ do wykonywania zapytań (tj. Nie wymaganie od użytkownika tworzenia jakichkolwiek zapytań SQL w celu pobrania pożądanych obiektów).

To otwarte pytanie, ale ogólnie zgadzają się, że w większości przypadków obiekty domeny (lub obiekty biznesowe - tak czy owak, wspomniane powyżej POCO) powinny być nieświadome logiki trwałości. Oznacza to, że zamiast wywoływać MyBusinessObject.Save(), masz klasę menedżera IO lub adaptera, a Ty wywołujesz Manager.Save(MyBusinessObject). W ten sposób unikasz ujawniania semantyki trwałości obiektów biznesowych - w ten sposób lepiej rozdzielasz obawy.

+5

Ale z encji EntityFramework generujemy tę separację już z wygenerowanymi klasami, które dziedziczą z ObjectContext do trwałości i klasami reprezentującymi encję. Czytam artykuł o magazynie msdn na EF 4.0 i jest sekcja o POCO, w artykule pisarz tworzy obiekt od zera ... Czy nie możemy użyć wygenerowanych jednostek? Czy to nie POCO? – pdiddy

+0

Czy możesz zamieścić link do artykułu? Jeśli twoja struktura wymaga, aby twoje klasy * encji * pochodziły z konkretnej klasy bazowej lub zawierały atrybuty specyficzne dla ramek lub implementowały interfejsy framework, to nie obsługuje POCO. Jeśli EF 4.0 nie umieszcza klasy bazowej lub wymagań dotyczących przypisania w swoich klasach encji, to obsługuje POCO. Zauważ, że to ograniczenie nie dotyczy klas, które są specjalnie przeznaczone do zarządzania semantyką trwałości - one * mają * być sprzężone z uporczywością, a mówienie o POCO tam brakuje punktu. – Dathan

+2

EF domyślnie użyje 'EntityObject' jako swojej klasy bazowej dla wszystkich jej elementów -> zdecydowanie nie POCO. * BUT *: dzięki EF4 masz możliwość włączenia obsługi POCO, w którym to przypadku twoje klasy nie pochodzą z żadnej konkretnej klasy bazowej, nie potrzebują implementować żadnego konkretnego interfejsu i nie potrzebują żadnych atrybutów albo -> czysty POCO. –

3

POCO = Zwykłe stare obiekty CLR.

Plain Old CLR (czyli C# lub VB) obiektów oznacza, że ​​mogę mówić C# lub VB cały czas piszę mój program i nie trzeba się martwić o ezoterycznego języka bazy jak

UPDATE MYTABLE SET MYFIELD1 = @MYPARAMETER1, MYFIELD2 = @MYPARAMETER2 BLAH BLAH 

EF generowanych jednostek == POCO podłączony (pośrednio) do bazy danych.

+1

Zwykłe stare obiekty CLR są bliższe prawdy. Działa to dobrze z VB.Net lub innymi językami zgodnymi z CLS. – sblom

0

Klasa POCO to klasa, która nie zależy od żadnej konkretnej klasy bazowej. Jest jak każda inna normalna klasa .net, dlatego nazywa się ją "zwykłymi starymi obiektami CLR". Te jednostki POCO (znane również jako obiekty ignorujące uporczywość) obsługują większość tych samych kwerend LINQ, co jednostki pochodne EntityObject.

0

POCO = Plain Old CLR Objects

POCO Przywileje:

Technologia Agnostycyzm jest to rozkosz: Koncepcja ta jest zwykle obrotowymi PI (Persistence Ignorance), ale to nie tylko to. Wytrwałość Niewiedza oznacza, że ​​twoje jednostki powinny zostać oczyszczone z ograniczeń związanych z ograniczeniami związanymi z uporczywością, które struktura - zazwyczaj ORM - wymusza na tobie. Jest to na przykład dla jeśli masz mapowanie na poziomie atrybutów, gdzie te atrybuty nie są częścią twojej domeny, ale istnieją tylko dlatego, że niektóre ramy chcą, aby się tam znajdowały, twoja domena nie jest wytrwałością ignorancji. Sidar said here

Powiązane problemy