2010-03-26 5 views
5

Zróbmy to na pierwszy rzut oka: Wiem, że SessionFactory jest niezmienny - Próbuję zmienić konfigurację w czasie wykonywania i zregenerować ISessionFactory.NHibernate: Jak zmienić konfigurację odwzorowań w środowisku wykonawczym?

W szczególności mam zamapowanego klienta, który będzie miał niektóre pola dodane do węzła komponentu dynamicznego w czasie wykonywania. Chciałbym zrobić coś takiego

var newSessionFactory = previousConfiguration 
    .RemoveClassMapping(typeof(Customer)) 
    .AddXmlString(newMappingForCustomer) 
    .BuildSessionFactory(); 

Jednak nie widzę żadnych oczywistych sposób, aby usunąć mapowanie, czy jest coś, co mogę zrobić krótki regeneracji całą konfigurację?

+0

Właściwie nie jest to kwestia Fluent NHibernate i wolałbym uniknąć przyjmując zależność w chwili obecnej, ale wezmę to w razie potrzeby. –

Odpowiedz

1

To niemożliwe. Będziesz musiał zregenerować urządzenie Configuration.

Moja pierwsza sugestia to wybór innej strategii dla swojego modelu.

Jednakże, jeśli jesteś zdecydowany iść z tym :-) można:

  • stworzyć "częściowy" Configuration (który nie zawiera Customer)
  • Serializować go do MemoryStream
  • Dodaj „baza” Customer mapowanie, jeśli potrzebne
  • Tworzenie tymczasowej SessionFactory
  • Pobieranie wszelkich informacji, ty ne ed mapować Customer
  • deserializowania zapisanych Configuration
  • Dodaj mapowanie Customer i stworzyć ostateczną SessionFactory
+0

Jaka jest inna strategia Diego? Jeśli do komponentów dynamicznych są dodawane pola, a odwzorowane kolumny są dodawane do baz danych w czasie wykonywania (choć nieczęsto), wydaje się, że regeneracja SessionFactory byłaby zdecydowanie najbardziej bezpośrednia. –

+0

Inna strategia nie dodaje pól do bazy danych w czasie wykonywania. Zamiast tego zachowaj oddzielną tabelę z niestandardowymi definicjami atrybutów, a drugą z niestandardowymi wartościami atrybutów. –

+0

Tak, to co początkowo zaproponowałem, ale ta strategia zabija zarówno wydajność, jak i zgodność ze starszymi wersjami, prawda? Jestem trochę zaskoczony, że NH nie został zaprojektowany z myślą o tym scenariuszu. To nie jest takie rzadkie. Z pewnością rozumiem, że niezmienność SessionFactory jest ważna, ale kogo to obchodzi, jeśli klasa konfiguracji zostanie pokrojona na tuzin różnych sposobów, jeśli i tak zregenerujesz fabrykę. –