Kamil Kliczbor @ asptip.net

14Nov/130

NHibernate processing *.hbm.xml order

NhLogoWhite64_med

Recently we had small problem with defining views in our mappings. Because we use mapping export to local MS-SQL database we needed to define the views in our *.xbm.xml files. The problem was arising when we wanted to have dependencies between views. First thing we thought it would make it work was to put the views in the order defined by hbm's names. That did nothing. Then we started to dig in the FluentNH code and we went deeper in NH then found these interesting lines of code in the Configuration.cs:

/// <summary>
/// Adds all of the assembly"s embedded resources whose names end with <c>.hbm.xml</c>.
/// </summary>
/// <param name="assembly">The assembly.</param>
/// <returns>This configuration object.</returns>
public Configuration AddAssembly(Assembly assembly)
{
	IList resourceNames = GetAllHbmXmlResourceNames(assembly);
	if (resourceNames.Count == 0)
	{
		log.Warn("No mapped documents found in assembly: " + assembly.FullName);
	}
	foreach (var name in resourceNames)
	{
		AddResource(name, assembly);
	}
	return this;
}

private static IList GetAllHbmXmlResourceNames(Assembly assembly)
{
	var result = new List<string>();

	foreach (var resource in assembly.GetManifestResourceNames())
	{
		if (resource.EndsWith(".hbm.xml"))
		{
			result.Add(resource);
		}
	}

	return result;
}

The answer was clear: the mappings are added to the queue (see class MappingsQueue.cs) and processed one by one in the order they were enqueued. And the order depends of the internal implementation of the GetManifestResourceNames method. Unfortunately this boils down to know the implementation of the method from System.Reflection.RuntimeAssembly that is quite hard to decompile and investigate.

[SecurityCritical]
[MethodImpl(MethodImplOptions.InternalCall)]
private static extern string[] GetManifestResourceNames(RuntimeAssembly assembly);

However from experiments we found out that the order of returned resources depends on the order they are defined in the *.csproj file.

Special thanks to Grzegorz S. for taking part in our experiments.

8Nov/130

NHibernate Internals: Exploring NHibernate Proxy Part 3

NhLogoWhite64_med

Introduction

This is the next post from the quesi-series of notes about NHibernate Proxies.

What is ProxyDummy?

In the first post I introduced generated class for MyProxyImpl class implementing IMyProxy interface. One of the interesting things here is ProxyDummy class the proxy is directly inheriting from:

public class INHibernateProxyProxy : ProxyDummy, INHibernateProxy, IMyProxy, ISerializable, IProxy
7Nov/130

NHibernate Internals: Exploring NHibernate Proxy Part 2

NhLogoWhite64_med

Introduction

In the previous post I showed how simple proxy class was generated by proxy factory. Now it is time to find some answers to the questions I asked.

The suspicious name of the proxy class

We have a mapped class called MyProxyImpl and it implements an interface IMyProxy. The implementing proxy class name is INHibernateProxyProxy. This is strange and questionable. Let's investigate this and I will try answer the first question: Why it has such a strange name?

3Nov/130

NHibernate Internals: Exploring NHibernate Proxy Part 1

NhLogoWhite64_med

Introduction

This is a first post from series I plan to write about proxy feature in NHibernate. I would treat this as a notes and observation rather than a regular tutorial. I hope that you can find these quasi-posts series useful. I encourage you to make experiments with NHibernate!
The version I'am working with is 3.3.1.4000. The names here or in the next posts will refer to the test case names or types used there.

NHibernate Proxy at a glance

NHibernate provides enabled by default feature called lazy-loading. In a one word: this is a feature that allows to keep a non-loaded referenced entity or collection of entities attached to the entity you are working with and loading them on demand when it is necessary.

29Sep/130

Strategie pozyskiwania encji w NHibernate

NhLogoWhite64_med

Wprowadzenie

Istnieje wiele sposobów, na podstawie których NHibernate uzyskuje dostęp do powiązanych encji lub kolekcji encji. Prawidłowe zarządzanie strategiami wczytywania powiązanych obiektów umożliwia w wielu przypadkach poprawienie wydajności aplikacji. Deklaracja sposobu dostępu do encji może być podana w metadanych pliku mapowań (*.hbm.xml) lub nadpisana w zapytaniach HQL lub Criteria.

9Sep/130

NHibernate Session Get vs Load

NhLogoWhite64_med

Wstęp

Wpis ten jest poświęcony sposobom pobierania encji w NHibernate o znanym identyfikatorze. W kontekście pobrania danych pojedynczej encji dostępnymi sposobami są:

  • użycie dowolnego API zapytań z restykcją na identyfikator, np.

user = session.QueryOver<User>()
                    .Where(x => x.Id == user.Id)
                    .SingleOrDefault<User>();
  • metoda Get()

  • metoda Load()

  • odwołanie z innej encji np. var user = employee.User.

W tym wpisie skupimy się na działaniu, podobieństwach oraz różnicach pomiędzy metodą Get() i Load() oraz następstwami ich użycia.

31Jan/110

101 przykładów zapytań w NHibernate 3.x – HQL, Criteria API, QueryOver i Linq – Dzielenie danych

Wprowadzenie

Wpis ten jest częścią artykułu poświęconemu wykonywaniu zapytań w NHibernate przy użyciu różnych sposobów jakie udostępnia ten mapper - HQL, Criteria API, QueryOver i Linq.

Część ta opisuje stosowanie dzielenie danych, tj otrzymywanie części wyników zapytania w określonych porcjach. W MS-SQLu można te zagadnienia zrealizować odpowiednio przy użyciu instrukcji

  • TOP - pobiera określoną liczbę pierwszych wyników zapytania
  • TOP wraz z ROW_NUMBER OVER (ORDER BY ...) - umożliwia pobranie "strony" wyników

Spis zapytań

30Jan/111

101 przykładów zapytań w NHibernate 3.x – HQL, Criteria API, QueryOver i Linq – Złączenia

Wprowadzenie

Wpis ten jest częścią artykułu poświęconemu wykonywaniu zapytań w NHibernate przy użyciu różnych sposobów jakie udostępnia ten mapper - HQL, Criteria API, QueryOver i Linq.

Część ta opisuje łączenie tabel przy użyciu klauzuli JOIN.

Spis zapytań

24Jan/111

101 przykładów zapytań w NHibernate 3.x – HQL, Criteria API, QueryOver i Linq – Projekcje

Wprowadzenie

Wpis ten jest częścią artykułu poświęconemu wykonywaniu zapytań w NHibernate przy użyciu różnych sposobów jakie udostępnia ten mapper - HQL, Criteria API, QueryOver i Linq.

Część ta opisuje stosowanie projekcji w zapytaniach. Jeżeli piszesz instrukcję SELECT i chcesz określić jakie kolumny lub jakie przekształcenia na kolumnach chcesz wykonać, możesz użyć składni SQL-a w następujący sposób:

SELECT NazwaKolumny, funkcja_przekształcająca(NazwaKolumny) FROM NazwaTabeli

Ponieważ dane uzyskiwane w wyniku wykonania zapytania prawie zawsze różnią się od danych mapowanych do encji, stosuje się klasy transformujące wyniki na obiekty DTO. W przypadku HQl-a, Criteria API stosuje się konstrukcję SetResultTransformer(Transformers.AliasToBean(typeof(NazwaKlasyDto))), w przypadku QueryOver - TransformUsing().

Spis zapytań

6Jan/112

101 przykładów zapytań w NHibernate 3.x – HQL, Criteria API, QueryOver i Linq – Sortowanie

Wprowadzenie

Wpis ten jest częścią artykułu poświęconemu wykonywaniu zapytań w NHibernate przy użyciu różnych sposobów jakie udostępnia ten mapper - HQL, Criteria API, QueryOver i Linq.

Część ta opisuje stosowanie sortowania danych w zapytaniach. Jeżeli piszesz instrukcję SELECT zachodzi czasem konieczność uporządkowania danych, które są zwracane w wyniku zapytania. Ogólnie rzecz biorąc stosujemy w SQL słowo ORDER BY wraz z opcjonalnym ASC|DESC oznaczającym kierunek sortowania. Koncepcję użycia przedstawiam poniżej:

SELECT Co FROM NazwaObiektu ORDER BY NazwaColumny [ASC|DESC], NazwaInnejKolumny [ASC|DESC]

Spis zapytań