2010-05-20 8 views
17

Mam kilka klas, które czytają z bardzo delikatnych tabel, dlatego chcę, aby były one używane przez NHibernate jako "ReadOnly". Ustanowienie .ReadOnly() na każdej mapie pola jest naprawdę niechlujne i nie jestem pewien, czy mam do niego zaufanie. Jak ustawić klasę tak, aby była całkowicie w trybie "tylko do odczytu", co mogę zrobić z tradycyjnymi mapowaniami XML?Fluent NHibernate: jak zmapować całą klasę jako ReadOnly?

Edytuj: Odpowiedź działa. Spodziewałem się, że wyrzuci wyjątek, jeśli spróbuję zaoszczędzić na obiekcie ReadOnly(), ale robi to po cichu.

Dzięki.

+0

Jakiekolwiek obejście? – kaptan

+0

@kaptan: Będę edytować mój komentarz do odpowiedzi. To działa. Właśnie oczekiwałem, że wyrzuci wyjątek, ale po cichu ignoruje wszelkie zmiany. – rebelliard

Odpowiedz

32

Z Fluent NHibernate, to tak proste, jak:

class EntityMap : ClassMap<Entity> 
{ 
    public EntityMap() 
    { 
     ReadOnly(); 

     // Mappings 
    } 
} 
11

tylko do odczytu() nieruchomość faktycznie nie działa tak jak można by oczekiwać. Ta właściwość zapewnia, że ​​pobierane obiekty są tylko do odczytu, więc nie można ich zaktualizować. Jednak NIE zapobiega to tworzeniu nowych rekordów, a nawet kasowaniu istniejących rekordów w bazie danych!

+1

Hmm, nie zauważyłem tego, co jest szalone! Wydaje mi się, że działałaby kombinacja konstruktora readonly i protected. – rebelliard

+1

Myślę, że "niezmienne" to lepsza nazwa dla niego. –

+0

'ReadOnly' to płynne nazewnictwo, wydaje się, że uznało je za lepsze od oryginalnego nazewnictwa NHibernate, [' mutable = "false" '] (http://nhibernate.info/doc/nhibernate-reference/mapping.html# klasa deklaracji odwzorowania). Być może w ich kontekście, gdzie zdefiniowali własność 'ReadOnly'on jako skrót dla' insert = "false" update = "false" ', ale moim zdaniem jest to niefortunne nazewnictwo dla zmienności klasy i kolekcji. –